@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,55 @@
1
+ # Factory Scripts
2
+
3
+ The scripts allow for a whitelisted party to deploy components of Harvest, such as vaults, pools, and strategies.
4
+ Important:
5
+ 1. Set gas limit to VERY high (~9,000,000)
6
+ 2. Deployments are pretty expensive: please make sure there is enough Ether (1 ETH, or more for one deployment).
7
+ 3. Always simulate the transaction first by appending the flag `--network hardhat` (or omitting `--network`)
8
+ 4. Once simulation is successful, use the mainnet flag: `--network mainnet`
9
+ 5. Take prerequisites into account (such as, creating a position token for Uniswap V3)
10
+
11
+ Latest factory addresses are located in `./test/test-config.js`, under `Factory`.
12
+
13
+ ### Regular vault (with upgradable strategy)
14
+
15
+ Deploying a new vault with the standard reward PotPool, using an upgradable strategy implementation (that was deployed earlier):
16
+
17
+ ```
18
+ npx hardhat run ./scripts/01-deploy-vault-regular-with-upgradable-strategy.js --network hardhat
19
+ Regular vault deployment with upgradable strategy.
20
+ > Prerequisite: deploy upgradable strategy implementation
21
+ Specify a unique ID (for the JSON), vault's underlying token address, and upgradable strategy implementation address
22
+ prompt: id: test_YEL_WETH
23
+ prompt: underlying: 0xc83cE8612164eF7A13d17DDea4271DD8e8EEbE5d
24
+ prompt: strategyImpl: 0xBa6b43ae8Ea74a5D7F4e65904aAf80bFB1Bc59CB
25
+ ======
26
+ test_YEL_WETH: {
27
+ "Underlying": "0xc83cE8612164eF7A13d17DDea4271DD8e8EEbE5d",
28
+ "NewVault": "0xd1c9CE4C3D87B2B9dDc500F6f47E65FB7d426Ac2",
29
+ "NewStrategy": "0x908B743A405F23Ea5877C14E32d76B1B7A97369D",
30
+ "NewPool": "0x9b2C5A51adac687867C19Bd76656702b47A24e16"
31
+ }
32
+ ======
33
+ Deployment complete. Add the JSON above to `harvest-api` (https://github.com/harvest-finance/harvest-api/blob/master/data/mainnet/addresses.json) repo and add entries to `tokens.js` and `pools.js`.
34
+ ```
35
+
36
+ ### Regular vault (no strategy)
37
+
38
+ Deploying a regular vault with the standard reward PotPool (no pre-defined strategy, but can be added later by Governance):
39
+
40
+ ```
41
+ npx hardhat run ./scripts/02-deploy-vault-regular.js --network hardhat
42
+ Regular vault deployment (no strategy).
43
+ Specify a unique ID (for the JSON) and the vault's underlying token address
44
+ prompt: id: dai_test
45
+ prompt: underlying: 0x6B175474E89094C44Da98b954EedeAC495271d0F
46
+ ======
47
+ dai_test: {
48
+ "Underlying": "0x6B175474E89094C44Da98b954EedeAC495271d0F",
49
+ "NewVault": "0xd1c9CE4C3D87B2B9dDc500F6f47E65FB7d426Ac2",
50
+ "NewStrategy": "0x0000000000000000000000000000000000000000",
51
+ "NewPool": "0x9b2C5A51adac687867C19Bd76656702b47A24e16"
52
+ }
53
+ ======
54
+ Deployment complete. Add the JSON above to `harvest-api` (https://github.com/harvest-finance/harvest-api/blob/master/data/mainnet/addresses.json) repo and add entries to `tokens.js` and `pools.js`.
55
+ ```
@@ -0,0 +1,42 @@
1
+ async function getFeeData() {
2
+ const feeData = await ethers.provider.getFeeData();
3
+ feeData.maxPriorityFeePerGas = 35e9;
4
+ if (feeData.maxFeePerGas < feeData.maxPriorityFeePerGas) {
5
+ feeData.maxFeePerGas = Number(feeData.maxFeePerGas) + Number(feeData.maxPriorityFeePerGas);
6
+ }
7
+ if (feeData.maxFeePerGas > 1000e9) {
8
+ feeData.maxFeePerGas = 1000e9;
9
+ }
10
+ if (feeData.maxFeePerGas / 6 > 35e9) {
11
+ feeData.maxPriorityFeePerGas = Math.round(feeData.maxFeePerGas / 6);
12
+ if (feeData.maxPriorityFeePerGas > 100e9) {
13
+ feeData.maxPriorityFeePerGas = 100e9;
14
+ }
15
+ }
16
+ return feeData;
17
+ }
18
+
19
+ async function getSigner() {
20
+ const signer = await ethers.provider.getSigner();
21
+ return signer;
22
+ }
23
+
24
+ async function type2Transaction(callFunction, ...params) {
25
+ const signer = await getSigner();
26
+ const feeData = await getFeeData();
27
+ const unsignedTx = await callFunction.request(...params);
28
+ const tx = await signer.sendTransaction({
29
+ from: unsignedTx.from,
30
+ to: unsignedTx.to,
31
+ data: unsignedTx.data,
32
+ maxFeePerGas: feeData.maxFeePerGas,
33
+ maxPriorityFeePerGas: feeData.maxPriorityFeePerGas,
34
+ gasLimit: 5e6
35
+ });
36
+ await tx.wait();
37
+ return tx;
38
+ }
39
+
40
+ module.exports = {
41
+ type2Transaction,
42
+ };
@@ -0,0 +1,207 @@
1
+ // Utilities
2
+ const Utils = require("../utilities/Utils.js");
3
+ const { impersonates, setupCoreProtocol, depositVault } = require("../utilities/hh-utils.js");
4
+
5
+ const addresses = require("../test-config.js");
6
+ const BigNumber = require("bignumber.js");
7
+ const IERC20 = artifacts.require("@openzeppelin/contracts/token/ERC20/IERC20.sol:IERC20");
8
+
9
+ const Strategy = artifacts.require("AaveSupplyStrategyMainnet_DAI");
10
+
11
+ //This test was developed at blockNumber 54064600
12
+
13
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
14
+ describe("Mainnet Aave DAI", function() {
15
+ let accounts;
16
+
17
+ // external contracts
18
+ let underlying;
19
+
20
+ // external setup
21
+ let underlyingWhale = "0x2728E3Bd1fd2065D02fC9F87803F31eBaD32b32C";
22
+ let usdce = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
23
+ let weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
24
+ let eurs = "0xE111178A87A3BFf0c8d18DECBa5798827539Ae99";
25
+
26
+ // parties in the protocol
27
+ let governance;
28
+ let farmer1;
29
+
30
+ // numbers used in tests
31
+ let farmerBalance;
32
+
33
+ // Core protocol contracts
34
+ let controller;
35
+ let vault;
36
+ let strategy;
37
+
38
+ async function setupExternalContracts() {
39
+ underlying = await IERC20.at("0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063");
40
+ console.log("Fetching Underlying at: ", underlying.address);
41
+ }
42
+
43
+ async function setupBalance(){
44
+ let etherGiver = accounts[9];
45
+ // Give whale some ether to make sure the following actions are good
46
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 100e18});
47
+
48
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
49
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
50
+ }
51
+
52
+ before(async function() {
53
+ governance = addresses.Governance;
54
+ accounts = await web3.eth.getAccounts();
55
+
56
+ farmer1 = accounts[1];
57
+
58
+ // impersonate accounts
59
+ await impersonates([governance, underlyingWhale]);
60
+
61
+ let etherGiver = accounts[9];
62
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 100e18});
63
+
64
+ await setupExternalContracts();
65
+ [controller, vault, strategy] = await setupCoreProtocol({
66
+ "existingVaultAddress": null,
67
+ "strategyArtifact": Strategy,
68
+ "strategyArtifactIsUpgradable": true,
69
+ "underlying": underlying,
70
+ "governance": governance,
71
+ "liquidation": [
72
+ {"uniV3": [underlying.address, weth]},
73
+ {"uniV3": [underlying.address, weth, addresses.miFARM]},
74
+ ],
75
+ });
76
+
77
+ // whale send underlying to farmers
78
+ await setupBalance();
79
+ });
80
+
81
+ describe("Happy path", function() {
82
+ it("Farmer should earn money", async function() {
83
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
84
+ console.log("Farmer old balance:", farmerOldBalance.toFixed());
85
+ await depositVault(farmer1, underlying, vault, farmerBalance);
86
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
87
+ console.log("Farmer fToken balance:", fTokenBalance.toFixed());
88
+
89
+ // Using half days is to simulate how we doHardwork in the real world
90
+ let hours = 10;
91
+ let blocksPerHour = 1565*5;
92
+ let oldSharePrice;
93
+ let newSharePrice;
94
+ for (let i = 0; i < hours; i++) {
95
+ console.log("loop ", i);
96
+
97
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
98
+ await controller.doHardWork(vault.address, { from: governance });
99
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
100
+
101
+ console.log("old shareprice: ", oldSharePrice.toFixed());
102
+ console.log("new shareprice: ", newSharePrice.toFixed());
103
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
104
+
105
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))*365;
106
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
107
+
108
+ console.log("instant APR:", apr*100, "%");
109
+ console.log("instant APY:", (apy-1)*100, "%");
110
+
111
+ await Utils.advanceNBlock(blocksPerHour);
112
+ }
113
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
114
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
115
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
116
+
117
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
118
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
119
+
120
+ console.log("earned!");
121
+ console.log("Overall APR:", apr*100, "%");
122
+ console.log("Overall APY:", (apy-1)*100, "%");
123
+
124
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
125
+ });
126
+ });
127
+
128
+
129
+
130
+ describe("Basic strategy functionality checks", function () {
131
+ it("Deposit to vault", async function () {
132
+ // deposit to vault such that we have something to work with
133
+ await depositVault(farmer1, underlying, vault, farmerBalance);
134
+
135
+ // check vault has at least farmerBalance (there could be some dust etc., so no exact check)
136
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
137
+ Utils.assertBNGte(vaultUnderlying, farmerBalance)
138
+ });
139
+
140
+ it("withdrawAllToVault()", async function () {
141
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
142
+ // doHardwork invests all underlying from the vault
143
+ await controller.doHardWork(vault.address, { from: governance });
144
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
145
+
146
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
147
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
148
+
149
+ // move all invested underlying back to the vault
150
+ await strategy.withdrawAllToVault({ from: governance });
151
+
152
+ // strategy has no underlying left
153
+ let investedUnderlyingBalanceNew = new BigNumber(await strategy.investedUnderlyingBalance());
154
+ assert.equal(investedUnderlyingBalanceNew.eq(BigNumber(0)), true);
155
+
156
+ // vault has all of the underlying from the strategy
157
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
158
+ Utils.assertBNGte(vaultUnderlyingNew, investedUnderlyingBalance)
159
+ });
160
+
161
+ it("withdrawToVault(uint256 _amount)", async function () {
162
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
163
+ // doHardwork invests all underlying from the vault
164
+ await controller.doHardWork(vault.address, { from: governance });
165
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
166
+
167
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
168
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
169
+
170
+ let amount = 1;
171
+ // move amount of underlying to vault
172
+ await strategy.withdrawToVault(amount, { from: governance });
173
+
174
+ // vault has exactly amount of underlying
175
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
176
+ assert.equal(new BigNumber(amount).eq(vaultUnderlyingNew), true);
177
+ });
178
+
179
+ it("unsalvagableTokens(address _token)", async function () {
180
+ // underlying is unsalvageable
181
+ let isUnderlyingUnsalvagable = await strategy.unsalvagableTokens(underlying.address);
182
+ assert.equal(isUnderlyingUnsalvagable, true);
183
+
184
+ // rewardToken is unsalvageable
185
+ let isRewardTokenUnsalvagable = await strategy.unsalvagableTokens(await strategy.rewardToken());
186
+ assert.equal(isRewardTokenUnsalvagable, true);
187
+
188
+ });
189
+
190
+ it("Remove all deposited LP tokens", async function () {
191
+ // remove all deposited LP tokens
192
+ let fTokenBalance = await vault.balanceOf(farmer1);
193
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
194
+
195
+ //check that there is nothing left in the strategy or vault
196
+ let strategyBalance = new BigNumber(await underlying.balanceOf(strategy.address));
197
+ assert.equal(strategyBalance.eq(BigNumber(0)), true);
198
+
199
+ let vaultBalance = new BigNumber(await underlying.balanceOf(vault.address));
200
+ assert.equal(vaultBalance.eq(BigNumber(0)), true);
201
+
202
+ let totalUnderlyingVaultAndStrategy = new BigNumber(await vault.underlyingBalanceWithInvestment());
203
+ assert.equal(totalUnderlyingVaultAndStrategy.eq(BigNumber(0)), true);
204
+ });
205
+ });
206
+
207
+ });
@@ -0,0 +1,207 @@
1
+ // Utilities
2
+ const Utils = require("../utilities/Utils.js");
3
+ const { impersonates, setupCoreProtocol, depositVault } = require("../utilities/hh-utils.js");
4
+
5
+ const addresses = require("../test-config.js");
6
+ const BigNumber = require("bignumber.js");
7
+ const IERC20 = artifacts.require("@openzeppelin/contracts/token/ERC20/IERC20.sol:IERC20");
8
+
9
+ const Strategy = artifacts.require("AaveSupplyStrategyMainnet_EURS");
10
+
11
+ //This test was developed at blockNumber 54064600
12
+
13
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
14
+ describe("Mainnet Aave EURS", function() {
15
+ let accounts;
16
+
17
+ // external contracts
18
+ let underlying;
19
+
20
+ // external setup
21
+ let underlyingWhale = "0x95E49B7a5a7aD75f0cd904f8f2329128025d9d2a";
22
+ let usdce = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
23
+ let weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
24
+ let eurs = "0xE111178A87A3BFf0c8d18DECBa5798827539Ae99";
25
+
26
+ // parties in the protocol
27
+ let governance;
28
+ let farmer1;
29
+
30
+ // numbers used in tests
31
+ let farmerBalance;
32
+
33
+ // Core protocol contracts
34
+ let controller;
35
+ let vault;
36
+ let strategy;
37
+
38
+ async function setupExternalContracts() {
39
+ underlying = await IERC20.at("0xE111178A87A3BFf0c8d18DECBa5798827539Ae99");
40
+ console.log("Fetching Underlying at: ", underlying.address);
41
+ }
42
+
43
+ async function setupBalance(){
44
+ let etherGiver = accounts[9];
45
+ // Give whale some ether to make sure the following actions are good
46
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 100e18});
47
+
48
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
49
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
50
+ }
51
+
52
+ before(async function() {
53
+ governance = addresses.Governance;
54
+ accounts = await web3.eth.getAccounts();
55
+
56
+ farmer1 = accounts[1];
57
+
58
+ // impersonate accounts
59
+ await impersonates([governance, underlyingWhale]);
60
+
61
+ let etherGiver = accounts[9];
62
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 100e18});
63
+
64
+ await setupExternalContracts();
65
+ [controller, vault, strategy] = await setupCoreProtocol({
66
+ "existingVaultAddress": null,
67
+ "strategyArtifact": Strategy,
68
+ "strategyArtifactIsUpgradable": true,
69
+ "underlying": underlying,
70
+ "governance": governance,
71
+ "liquidation": [
72
+ {"uniV3": [eurs, usdce, weth]},
73
+ {"uniV3": [eurs, usdce, weth, addresses.miFARM]},
74
+ ],
75
+ });
76
+
77
+ // whale send underlying to farmers
78
+ await setupBalance();
79
+ });
80
+
81
+ describe("Happy path", function() {
82
+ it("Farmer should earn money", async function() {
83
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
84
+ console.log("Farmer old balance:", farmerOldBalance.toFixed());
85
+ await depositVault(farmer1, underlying, vault, farmerBalance);
86
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
87
+ console.log("Farmer fToken balance:", fTokenBalance.toFixed());
88
+
89
+ // Using half days is to simulate how we doHardwork in the real world
90
+ let hours = 10;
91
+ let blocksPerHour = 1565*5;
92
+ let oldSharePrice;
93
+ let newSharePrice;
94
+ for (let i = 0; i < hours; i++) {
95
+ console.log("loop ", i);
96
+
97
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
98
+ await controller.doHardWork(vault.address, { from: governance });
99
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
100
+
101
+ console.log("old shareprice: ", oldSharePrice.toFixed());
102
+ console.log("new shareprice: ", newSharePrice.toFixed());
103
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
104
+
105
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))*365;
106
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
107
+
108
+ console.log("instant APR:", apr*100, "%");
109
+ console.log("instant APY:", (apy-1)*100, "%");
110
+
111
+ await Utils.advanceNBlock(blocksPerHour);
112
+ }
113
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
114
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
115
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
116
+
117
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
118
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
119
+
120
+ console.log("earned!");
121
+ console.log("Overall APR:", apr*100, "%");
122
+ console.log("Overall APY:", (apy-1)*100, "%");
123
+
124
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
125
+ });
126
+ });
127
+
128
+
129
+
130
+ describe("Basic strategy functionality checks", function () {
131
+ it("Deposit to vault", async function () {
132
+ // deposit to vault such that we have something to work with
133
+ await depositVault(farmer1, underlying, vault, farmerBalance);
134
+
135
+ // check vault has at least farmerBalance (there could be some dust etc., so no exact check)
136
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
137
+ Utils.assertBNGte(vaultUnderlying, farmerBalance)
138
+ });
139
+
140
+ it("withdrawAllToVault()", async function () {
141
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
142
+ // doHardwork invests all underlying from the vault
143
+ await controller.doHardWork(vault.address, { from: governance });
144
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
145
+
146
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
147
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
148
+
149
+ // move all invested underlying back to the vault
150
+ await strategy.withdrawAllToVault({ from: governance });
151
+
152
+ // strategy has no underlying left
153
+ let investedUnderlyingBalanceNew = new BigNumber(await strategy.investedUnderlyingBalance());
154
+ assert.equal(investedUnderlyingBalanceNew.eq(BigNumber(0)), true);
155
+
156
+ // vault has all of the underlying from the strategy
157
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
158
+ Utils.assertBNGte(vaultUnderlyingNew, investedUnderlyingBalance)
159
+ });
160
+
161
+ it("withdrawToVault(uint256 _amount)", async function () {
162
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
163
+ // doHardwork invests all underlying from the vault
164
+ await controller.doHardWork(vault.address, { from: governance });
165
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
166
+
167
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
168
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
169
+
170
+ let amount = 1;
171
+ // move amount of underlying to vault
172
+ await strategy.withdrawToVault(amount, { from: governance });
173
+
174
+ // vault has exactly amount of underlying
175
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
176
+ assert.equal(new BigNumber(amount).eq(vaultUnderlyingNew), true);
177
+ });
178
+
179
+ it("unsalvagableTokens(address _token)", async function () {
180
+ // underlying is unsalvageable
181
+ let isUnderlyingUnsalvagable = await strategy.unsalvagableTokens(underlying.address);
182
+ assert.equal(isUnderlyingUnsalvagable, true);
183
+
184
+ // rewardToken is unsalvageable
185
+ let isRewardTokenUnsalvagable = await strategy.unsalvagableTokens(await strategy.rewardToken());
186
+ assert.equal(isRewardTokenUnsalvagable, true);
187
+
188
+ });
189
+
190
+ it("Remove all deposited LP tokens", async function () {
191
+ // remove all deposited LP tokens
192
+ let fTokenBalance = await vault.balanceOf(farmer1);
193
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
194
+
195
+ //check that there is nothing left in the strategy or vault
196
+ let strategyBalance = new BigNumber(await underlying.balanceOf(strategy.address));
197
+ assert.equal(strategyBalance.eq(BigNumber(0)), true);
198
+
199
+ let vaultBalance = new BigNumber(await underlying.balanceOf(vault.address));
200
+ assert.equal(vaultBalance.eq(BigNumber(0)), true);
201
+
202
+ let totalUnderlyingVaultAndStrategy = new BigNumber(await vault.underlyingBalanceWithInvestment());
203
+ assert.equal(totalUnderlyingVaultAndStrategy.eq(BigNumber(0)), true);
204
+ });
205
+ });
206
+
207
+ });