@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,132 @@
1
+ // Utilities
2
+ const Utils = require("../utilities/Utils.js");
3
+ const {
4
+ impersonates,
5
+ setupCoreProtocol,
6
+ depositVault,
7
+ swapMaticToToken,
8
+ addLiquidity
9
+ } = require("../utilities/hh-utils.js");
10
+
11
+ const addresses = require("../test-config.js");
12
+ const { send } = require("@openzeppelin/test-helpers");
13
+ const BigNumber = require("bignumber.js");
14
+ const IERC20 = artifacts.require("IERC20");
15
+
16
+ //const Strategy = artifacts.require("");
17
+ const Strategy = artifacts.require("CurveStrategyAaveMainnet");
18
+ const IDeposit = artifacts.require("ICurveDeposit_3token_underlying");
19
+
20
+
21
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
22
+ describe("Polygon Mainnet Curve Aave", function() {
23
+ let accounts;
24
+
25
+ // external contracts
26
+ let underlying;
27
+
28
+ // external setup
29
+ let usdc = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
30
+ let depositAddr = "0x445FE580eF8d70FF569aB36e80c647af338db351";
31
+ let deposit;
32
+
33
+ // parties in the protocol
34
+ let governance;
35
+ let farmer1;
36
+
37
+ // numbers used in tests
38
+ let farmerBalance;
39
+
40
+ // Core protocol contracts
41
+ let controller;
42
+ let vault;
43
+ let strategy;
44
+
45
+ async function setupExternalContracts() {
46
+ underlying = await IERC20.at("0xE7a24EF0C5e95Ffb0f6684b813A78F2a3AD7D171");
47
+ console.log("Fetching Underlying at: ", underlying.address);
48
+ }
49
+
50
+ async function setupBalance(){
51
+ token1 = await IERC20.at(usdc);
52
+ await swapMaticToToken (
53
+ farmer1,
54
+ [addresses.WMATIC, token1.address],
55
+ "1000" + "000000000000000000",
56
+ addresses.QuickRouter
57
+ );
58
+ farmerToken1Balance = await token1.balanceOf(farmer1);
59
+ deposit = await IDeposit.at(depositAddr);
60
+ await token1.approve(depositAddr, farmerToken1Balance, { from:farmer1});
61
+ await deposit.add_liquidity([0, farmerToken1Balance, 0], 0, true, {from:farmer1});
62
+ farmerBalance = await underlying.balanceOf(farmer1);
63
+ }
64
+
65
+ before(async function() {
66
+ governance = "0xf00dD244228F51547f0563e60bCa65a30FBF5f7f";
67
+ accounts = await web3.eth.getAccounts();
68
+
69
+ farmer1 = accounts[1];
70
+
71
+ // impersonate accounts
72
+ await impersonates([governance]);
73
+
74
+ let etherGiver = accounts[9];
75
+ await send.ether(etherGiver, governance, "100" + "000000000000000000")
76
+
77
+ await setupExternalContracts();
78
+ [controller, vault, strategy] = await setupCoreProtocol({
79
+ "existingVaultAddress": null,
80
+ "strategyArtifact": Strategy,
81
+ "strategyArtifactIsUpgradable": true,
82
+ "underlying": underlying,
83
+ "governance": governance,
84
+ });
85
+
86
+ await strategy.setSellFloor(0, {from:governance});
87
+
88
+ // whale send underlying to farmers
89
+ await setupBalance();
90
+ });
91
+
92
+ describe("Happy path", function() {
93
+ it("Farmer should earn money", async function() {
94
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
95
+ await depositVault(farmer1, underlying, vault, farmerBalance);
96
+
97
+ // Using half days is to simulate how we doHardwork in the real world
98
+ // The rewards are time based and Hardhat propagates the chain with a block time of 16s
99
+ // So we have 225 blocks per hour, 2700 blocks per 12 hours.
100
+ let hours = 10;
101
+ let blocksPerHour = 2700;
102
+ let oldSharePrice;
103
+ let newSharePrice;
104
+ for (let i = 0; i < hours; i++) {
105
+ console.log("loop ", i);
106
+
107
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
108
+ await controller.doHardWork(vault.address, { from: governance });
109
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
110
+
111
+ console.log("old shareprice: ", oldSharePrice.toFixed());
112
+ console.log("new shareprice: ", newSharePrice.toFixed());
113
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
114
+
115
+ await Utils.advanceNBlock(blocksPerHour);
116
+ }
117
+ await vault.withdraw(new BigNumber(await vault.balanceOf(farmer1)).toFixed(), { from: farmer1 });
118
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
119
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
120
+
121
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/225))*365;
122
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/225))+1)**365;
123
+
124
+ console.log("earned!");
125
+ console.log("APR:", apr*100, "%");
126
+ console.log("APY:", (apy-1)*100, "%");
127
+
128
+ await strategy.withdrawAllToVault({from:governance}); // making sure can withdraw all for a next switch
129
+
130
+ });
131
+ });
132
+ });
@@ -0,0 +1,135 @@
1
+ // Utilities
2
+ const Utils = require("../utilities/Utils.js");
3
+ const {
4
+ impersonates,
5
+ setupCoreProtocol,
6
+ depositVault,
7
+ swapMaticToToken,
8
+ addLiquidity
9
+ } = require("../utilities/hh-utils.js");
10
+
11
+ const addresses = require("../test-config.js");
12
+ const { send } = require("@openzeppelin/test-helpers");
13
+ const BigNumber = require("bignumber.js");
14
+ const IERC20 = artifacts.require("IERC20");
15
+
16
+ //const Strategy = artifacts.require("");
17
+ const Strategy = artifacts.require("CurveStrategyAcricrypto3Mainnet");
18
+ const IDeposit = artifacts.require("ICurveDeposit_5token");
19
+
20
+ // test run with block number: 25091822
21
+
22
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
23
+ describe("Polygon Mainnet Curve atricrypto3", function() {
24
+ let accounts;
25
+
26
+ // external contracts
27
+ let underlying;
28
+
29
+ // external setup
30
+ let usdt = "0xc2132D05D31c914a87C6611C10748AEb04B58e8F";
31
+ let depositAddr = "0x1d8b86e3D88cDb2d34688e87E72F388Cb541B7C8";
32
+ let deposit;
33
+
34
+ // parties in the protocol
35
+ let governance;
36
+ let farmer1;
37
+
38
+ // numbers used in tests
39
+ let farmerBalance;
40
+
41
+ // Core protocol contracts
42
+ let controller;
43
+ let vault;
44
+ let strategy;
45
+
46
+ async function setupExternalContracts() {
47
+ underlying = await IERC20.at("0xdAD97F7713Ae9437fa9249920eC8507e5FbB23d3");
48
+ console.log("Fetching Underlying at: ", underlying.address);
49
+ }
50
+
51
+ async function setupBalance(){
52
+ token1 = await IERC20.at(usdt);
53
+ await swapMaticToToken (
54
+ farmer1,
55
+ [addresses.WMATIC, token1.address],
56
+ "1000" + "000000000000000000",
57
+ addresses.QuickRouter
58
+ );
59
+ farmerToken1Balance = await token1.balanceOf(farmer1);
60
+ console.log("farmerToken1Balance:", new BigNumber(farmerToken1Balance).toFixed());
61
+ deposit = await IDeposit.at(depositAddr);
62
+ await token1.approve(depositAddr, farmerToken1Balance, { from:farmer1});
63
+ await deposit.add_liquidity([0, 0, farmerToken1Balance, 0, 0], 0, {from:farmer1});
64
+ farmerBalance = await underlying.balanceOf(farmer1);
65
+ }
66
+
67
+ before(async function() {
68
+ governance = "0xf00dD244228F51547f0563e60bCa65a30FBF5f7f";
69
+ accounts = await web3.eth.getAccounts();
70
+
71
+ farmer1 = accounts[1];
72
+
73
+ // impersonate accounts
74
+ await impersonates([governance]);
75
+
76
+ let etherGiver = accounts[9];
77
+ await send.ether(etherGiver, governance, "100" + "000000000000000000")
78
+
79
+ await setupExternalContracts();
80
+ [controller, vault, strategy] = await setupCoreProtocol({
81
+ "existingVaultAddress": null,
82
+ "strategyArtifact": Strategy,
83
+ "strategyArtifactIsUpgradable": true,
84
+ "underlying": underlying,
85
+ "governance": governance,
86
+ });
87
+
88
+ await strategy.setSellFloor(0, {from:governance});
89
+
90
+ // whale send underlying to farmers
91
+ await setupBalance();
92
+ });
93
+
94
+ describe("Happy path", function() {
95
+ it("Farmer should earn money", async function() {
96
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
97
+ await depositVault(farmer1, underlying, vault, farmerBalance);
98
+
99
+ // Using half days is to simulate how we doHardwork in the real world
100
+ // The rewards are time based and polygon network has according to https://polygonscan.com/chart/blocks
101
+ // 30'000 to 41'000 blocks per day, lets assume 35'00 blocks per day therefore we have about 1500 blocks per hour (35'000 / 24= ~1459)
102
+ // therfore we have 12*1500 = 18'000 blocks per 12 hours
103
+ let hours = 10;
104
+ let blocksPerHour = 12*1500;
105
+ let oldSharePrice;
106
+ let newSharePrice;
107
+ for (let i = 0; i < hours; i++) {
108
+ console.log("loop ", i);
109
+
110
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
111
+ await controller.doHardWork(vault.address, { from: governance });
112
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
113
+
114
+ console.log("old shareprice: ", oldSharePrice.toFixed());
115
+ console.log("new shareprice: ", newSharePrice.toFixed());
116
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
117
+
118
+ await Utils.advanceNBlock(blocksPerHour);
119
+ }
120
+ await vault.withdraw(new BigNumber(await vault.balanceOf(farmer1)).toFixed(), { from: farmer1 });
121
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
122
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
123
+
124
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1500))*365;
125
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1500))+1)**365;
126
+
127
+ console.log("earned!");
128
+ console.log("APR:", apr*100, "%");
129
+ console.log("APY:", (apy-1)*100, "%");
130
+
131
+ await strategy.withdrawAllToVault({from:governance}); // making sure can withdraw all for a next switch
132
+
133
+ });
134
+ });
135
+ });
@@ -0,0 +1,135 @@
1
+ // Utilities
2
+ const Utils = require("../utilities/Utils.js");
3
+ const {
4
+ impersonates,
5
+ setupCoreProtocol,
6
+ depositVault,
7
+ swapMaticToToken,
8
+ addLiquidity
9
+ } = require("../utilities/hh-utils.js");
10
+
11
+ const addresses = require("../test-config.js");
12
+ const { send } = require("@openzeppelin/test-helpers");
13
+ const BigNumber = require("bignumber.js");
14
+ const IERC20 = artifacts.require("IERC20");
15
+
16
+ //const Strategy = artifacts.require("");
17
+ const Strategy = artifacts.require("CurveStrategyEurtusdMainnet");
18
+ const IDeposit = artifacts.require("ICurveDeposit_4token");
19
+
20
+ // test run with block number: 25091822
21
+
22
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
23
+ describe("Polygon Mainnet Curve eurtusd", function() {
24
+ let accounts;
25
+
26
+ // external contracts
27
+ let underlying;
28
+
29
+ // external setup
30
+ let dai = "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063";
31
+ let depositAddr = "0x225FB4176f0E20CDb66b4a3DF70CA3063281E855";
32
+ let deposit;
33
+
34
+ // parties in the protocol
35
+ let governance;
36
+ let farmer1;
37
+
38
+ // numbers used in tests
39
+ let farmerBalance;
40
+
41
+ // Core protocol contracts
42
+ let controller;
43
+ let vault;
44
+ let strategy;
45
+
46
+ async function setupExternalContracts() {
47
+ underlying = await IERC20.at("0x600743B1d8A96438bD46836fD34977a00293f6Aa");
48
+ console.log("Fetching Underlying at: ", underlying.address);
49
+ }
50
+
51
+ async function setupBalance(){
52
+ token1 = await IERC20.at(dai);
53
+ await swapMaticToToken (
54
+ farmer1,
55
+ [addresses.WMATIC, token1.address],
56
+ "1000" + "000000000000000000",
57
+ addresses.QuickRouter
58
+ );
59
+ farmerToken1Balance = await token1.balanceOf(farmer1);
60
+ console.log("farmerToken1Balance:", new BigNumber(farmerToken1Balance).toFixed());
61
+ deposit = await IDeposit.at(depositAddr);
62
+ await token1.approve(depositAddr, farmerToken1Balance, { from:farmer1});
63
+ await deposit.add_liquidity([0, farmerToken1Balance, 0, 0], 0, {from:farmer1});
64
+ farmerBalance = await underlying.balanceOf(farmer1);
65
+ }
66
+
67
+ before(async function() {
68
+ governance = "0xf00dD244228F51547f0563e60bCa65a30FBF5f7f";
69
+ accounts = await web3.eth.getAccounts();
70
+
71
+ farmer1 = accounts[1];
72
+
73
+ // impersonate accounts
74
+ await impersonates([governance]);
75
+
76
+ let etherGiver = accounts[9];
77
+ await send.ether(etherGiver, governance, "100" + "000000000000000000")
78
+
79
+ await setupExternalContracts();
80
+ [controller, vault, strategy] = await setupCoreProtocol({
81
+ "existingVaultAddress": null,
82
+ "strategyArtifact": Strategy,
83
+ "strategyArtifactIsUpgradable": true,
84
+ "underlying": underlying,
85
+ "governance": governance,
86
+ });
87
+
88
+ await strategy.setSellFloor(0, {from:governance});
89
+
90
+ // whale send underlying to farmers
91
+ await setupBalance();
92
+ });
93
+
94
+ describe("Happy path", function() {
95
+ it("Farmer should earn money", async function() {
96
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
97
+ await depositVault(farmer1, underlying, vault, farmerBalance);
98
+
99
+ // Using half days is to simulate how we doHardwork in the real world
100
+ // The rewards are time based and polygon network has according to https://polygonscan.com/chart/blocks
101
+ // 30'000 to 41'000 blocks per day, lets assume 35'00 blocks per day therefore we have about 1500 blocks per hour (35'000 / 24= ~1459)
102
+ // therfore we have 12*1500 = 18'000 blocks per 12 hours
103
+ let hours = 10;
104
+ let blocksPerHour = 18000;
105
+ let oldSharePrice;
106
+ let newSharePrice;
107
+ for (let i = 0; i < hours; i++) {
108
+ console.log("loop ", i);
109
+
110
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
111
+ await controller.doHardWork(vault.address, { from: governance });
112
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
113
+
114
+ console.log("old shareprice: ", oldSharePrice.toFixed());
115
+ console.log("new shareprice: ", newSharePrice.toFixed());
116
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
117
+
118
+ await Utils.advanceNBlock(blocksPerHour);
119
+ }
120
+ await vault.withdraw(new BigNumber(await vault.balanceOf(farmer1)).toFixed(), { from: farmer1 });
121
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
122
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
123
+
124
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1500))*365;
125
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1500))+1)**365;
126
+
127
+ console.log("earned!");
128
+ console.log("APR:", apr*100, "%");
129
+ console.log("APY:", (apy-1)*100, "%");
130
+
131
+ await strategy.withdrawAllToVault({from:governance}); // making sure can withdraw all for a next switch
132
+
133
+ });
134
+ });
135
+ });
@@ -0,0 +1,212 @@
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("GammaMerklStrategyMainnet_QS_ETH_USDC");
10
+
11
+ //This test was developed at blockNumber 53865380
12
+
13
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
14
+ describe("Mainnet Quickswap-Gamma ETH-USDC", function() {
15
+ let accounts;
16
+
17
+ // external contracts
18
+ let underlying;
19
+ let quick;
20
+
21
+ // external setup
22
+ let underlyingWhale = "0x539460Bd8D7d6130ce6C4A65c0b59DA3b3d2da42";
23
+ let quickWhale = "0x41dd65795c24273A3e3B910ea3e2D7866F5AFDDa";
24
+ let quickAddr = "0xB5C064F955D8e7F38fE0460C556a72987494eE17";
25
+ let usdc = "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359";
26
+ let weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
27
+
28
+ // parties in the protocol
29
+ let governance;
30
+ let farmer1;
31
+
32
+ // numbers used in tests
33
+ let farmerBalance;
34
+
35
+ // Core protocol contracts
36
+ let controller;
37
+ let vault;
38
+ let strategy;
39
+
40
+ async function setupExternalContracts() {
41
+ underlying = await IERC20.at("0x3974FbDC22741A1632E024192111107b202F214f");
42
+ quick = await IERC20.at(quickAddr);
43
+ console.log("Fetching Underlying at: ", underlying.address);
44
+ }
45
+
46
+ async function setupBalance(){
47
+ let etherGiver = accounts[9];
48
+ // Give whale some ether to make sure the following actions are good
49
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 100e18});
50
+ await web3.eth.sendTransaction({ from: etherGiver, to: quickWhale, value: 100e18});
51
+
52
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
53
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
54
+ }
55
+
56
+ before(async function() {
57
+ governance = addresses.Governance;
58
+ accounts = await web3.eth.getAccounts();
59
+
60
+ farmer1 = accounts[1];
61
+
62
+ // impersonate accounts
63
+ await impersonates([governance, underlyingWhale, quickWhale]);
64
+
65
+ let etherGiver = accounts[9];
66
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 100e18});
67
+
68
+ await setupExternalContracts();
69
+ [controller, vault, strategy] = await setupCoreProtocol({
70
+ "existingVaultAddress": null,
71
+ "strategyArtifact": Strategy,
72
+ "strategyArtifactIsUpgradable": true,
73
+ "underlying": underlying,
74
+ "governance": governance,
75
+ "liquidation": [
76
+ {"uniV3": [weth, usdc]},
77
+ ],
78
+ });
79
+
80
+ // whale send underlying to farmers
81
+ await setupBalance();
82
+ });
83
+
84
+ describe("Happy path", function() {
85
+ it("Farmer should earn money", async function() {
86
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
87
+ console.log("Farmer old balance:", farmerOldBalance.toFixed());
88
+ await depositVault(farmer1, underlying, vault, farmerBalance);
89
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
90
+ console.log("Farmer fToken balance:", fTokenBalance.toFixed());
91
+
92
+ // Using half days is to simulate how we doHardwork in the real world
93
+ let hours = 10;
94
+ let blocksPerHour = 1565*5;
95
+ let oldSharePrice;
96
+ let newSharePrice;
97
+ for (let i = 0; i < hours; i++) {
98
+ console.log("loop ", i);
99
+
100
+ await quick.transfer(strategy.address, new BigNumber(100e18), { from: quickWhale });
101
+
102
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
103
+ await controller.doHardWork(vault.address, { from: governance });
104
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
105
+
106
+ console.log("old shareprice: ", oldSharePrice.toFixed());
107
+ console.log("new shareprice: ", newSharePrice.toFixed());
108
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
109
+
110
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))*365;
111
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
112
+
113
+ console.log("instant APR:", apr*100, "%");
114
+ console.log("instant APY:", (apy-1)*100, "%");
115
+
116
+ await Utils.advanceNBlock(blocksPerHour);
117
+ }
118
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
119
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
120
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
121
+
122
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
123
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
124
+
125
+ console.log("earned!");
126
+ console.log("Overall APR:", apr*100, "%");
127
+ console.log("Overall APY:", (apy-1)*100, "%");
128
+
129
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
130
+ });
131
+ });
132
+
133
+
134
+
135
+ describe("Basic strategy functionality checks", function () {
136
+ it("Deposit to vault", async function () {
137
+ // deposit to vault such that we have something to work with
138
+ await depositVault(farmer1, underlying, vault, farmerBalance);
139
+
140
+ // check vault has at least farmerBalance (there could be some dust etc., so no exact check)
141
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
142
+ Utils.assertBNGte(vaultUnderlying, farmerBalance)
143
+ });
144
+
145
+ it("withdrawAllToVault()", async function () {
146
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
147
+ // doHardwork invests all underlying from the vault
148
+ await controller.doHardWork(vault.address, { from: governance });
149
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
150
+
151
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
152
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
153
+
154
+ // move all invested underlying back to the vault
155
+ await strategy.withdrawAllToVault({ from: governance });
156
+
157
+ // strategy has no underlying left
158
+ let investedUnderlyingBalanceNew = new BigNumber(await strategy.investedUnderlyingBalance());
159
+ assert.equal(investedUnderlyingBalanceNew.eq(BigNumber(0)), true);
160
+
161
+ // vault has all of the underlying from the strategy
162
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
163
+ Utils.assertBNGte(vaultUnderlyingNew, investedUnderlyingBalance)
164
+ });
165
+
166
+ it("withdrawToVault(uint256 _amount)", async function () {
167
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
168
+ // doHardwork invests all underlying from the vault
169
+ await controller.doHardWork(vault.address, { from: governance });
170
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
171
+
172
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
173
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
174
+
175
+ let amount = 1;
176
+ // move amount of underlying to vault
177
+ await strategy.withdrawToVault(amount, { from: governance });
178
+
179
+ // vault has exactly amount of underlying
180
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
181
+ assert.equal(new BigNumber(amount).eq(vaultUnderlyingNew), true);
182
+ });
183
+
184
+ it("unsalvagableTokens(address _token)", async function () {
185
+ // underlying is unsalvageable
186
+ let isUnderlyingUnsalvagable = await strategy.unsalvagableTokens(underlying.address);
187
+ assert.equal(isUnderlyingUnsalvagable, true);
188
+
189
+ // rewardToken is unsalvageable
190
+ let isRewardTokenUnsalvagable = await strategy.unsalvagableTokens(await strategy.rewardToken());
191
+ assert.equal(isRewardTokenUnsalvagable, true);
192
+
193
+ });
194
+
195
+ it("Remove all deposited LP tokens", async function () {
196
+ // remove all deposited LP tokens
197
+ let fTokenBalance = await vault.balanceOf(farmer1);
198
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
199
+
200
+ //check that there is nothing left in the strategy or vault
201
+ let strategyBalance = new BigNumber(await underlying.balanceOf(strategy.address));
202
+ assert.equal(strategyBalance.eq(BigNumber(0)), true);
203
+
204
+ let vaultBalance = new BigNumber(await underlying.balanceOf(vault.address));
205
+ assert.equal(vaultBalance.eq(BigNumber(0)), true);
206
+
207
+ let totalUnderlyingVaultAndStrategy = new BigNumber(await vault.underlyingBalanceWithInvestment());
208
+ assert.equal(totalUnderlyingVaultAndStrategy.eq(BigNumber(0)), true);
209
+ });
210
+ });
211
+
212
+ });