@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,199 @@
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("QuickGammaStrategyMainnet_MATIC_USDC_narrow");
10
+
11
+ //This test was developed at blockNumber 39551730
12
+
13
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
14
+ describe("Mainnet Quickswap-Gamma MATIC-USDC (narrow)", function() {
15
+ let accounts;
16
+
17
+ // external contracts
18
+ let underlying;
19
+
20
+ // external setup
21
+ let underlyingWhale = "0xd84E11beE5D555CCd905817Cb8CBBd5b6e6C4f0D";
22
+ let vaultAddr = "0xa5422F737F24b10A0928D5E7f6cf404D077e1CD1";
23
+
24
+ // parties in the protocol
25
+ let governance;
26
+ let farmer1;
27
+
28
+ // numbers used in tests
29
+ let farmerBalance;
30
+
31
+ // Core protocol contracts
32
+ let controller;
33
+ let vault;
34
+ let strategy;
35
+
36
+ async function setupExternalContracts() {
37
+ underlying = await IERC20.at("0x04d521E2c414E6d898c6F2599FdD863Edf49e247");
38
+ console.log("Fetching Underlying at: ", underlying.address);
39
+ }
40
+
41
+ async function setupBalance(){
42
+ let etherGiver = accounts[9];
43
+ // Give whale some ether to make sure the following actions are good
44
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 1e18});
45
+
46
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
47
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
48
+ }
49
+
50
+ before(async function() {
51
+ governance = "0xf00dD244228F51547f0563e60bCa65a30FBF5f7f";
52
+ accounts = await web3.eth.getAccounts();
53
+
54
+ farmer1 = accounts[1];
55
+
56
+ // impersonate accounts
57
+ await impersonates([governance, underlyingWhale]);
58
+
59
+ await setupExternalContracts();
60
+ [controller, vault, strategy] = await setupCoreProtocol({
61
+ "existingVaultAddress": vaultAddr,
62
+ "upgradeStrategy": true,
63
+ "strategyArtifact": Strategy,
64
+ "strategyArtifactIsUpgradable": true,
65
+ "underlying": underlying,
66
+ "governance": governance,
67
+ });
68
+
69
+ // whale send underlying to farmers
70
+ await setupBalance();
71
+ });
72
+
73
+ describe("Happy path", function() {
74
+ it("Farmer should earn money", async function() {
75
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
76
+ console.log("Farmer old balance:", farmerOldBalance.toFixed());
77
+ await depositVault(farmer1, underlying, vault, farmerBalance);
78
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
79
+ console.log("Farmer fToken balance:", fTokenBalance.toFixed());
80
+
81
+ // Using half days is to simulate how we doHardwork in the real world
82
+ let hours = 10;
83
+ let blocksPerHour = 1565*5;
84
+ let oldSharePrice;
85
+ let newSharePrice;
86
+ for (let i = 0; i < hours; i++) {
87
+ console.log("loop ", i);
88
+
89
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
90
+ await controller.doHardWork(vault.address, { from: governance });
91
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
92
+
93
+ console.log("old shareprice: ", oldSharePrice.toFixed());
94
+ console.log("new shareprice: ", newSharePrice.toFixed());
95
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
96
+
97
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))*365;
98
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
99
+
100
+ console.log("instant APR:", apr*100, "%");
101
+ console.log("instant APY:", (apy-1)*100, "%");
102
+
103
+ await Utils.advanceNBlock(blocksPerHour);
104
+ }
105
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
106
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
107
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
108
+
109
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
110
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
111
+
112
+ console.log("earned!");
113
+ console.log("Overall APR:", apr*100, "%");
114
+ console.log("Overall APY:", (apy-1)*100, "%");
115
+
116
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
117
+ });
118
+ });
119
+
120
+
121
+
122
+ describe("Basic strategy functionality checks", function () {
123
+ it("Deposit to vault", async function () {
124
+ // deposit to vault such that we have something to work with
125
+ await depositVault(farmer1, underlying, vault, farmerBalance);
126
+
127
+ // check vault has at least farmerBalance (there could be some dust etc., so no exact check)
128
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
129
+ Utils.assertBNGte(vaultUnderlying, farmerBalance)
130
+ });
131
+
132
+ it("withdrawAllToVault()", async function () {
133
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
134
+ // doHardwork invests all underlying from the vault
135
+ await controller.doHardWork(vault.address, { from: governance });
136
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
137
+
138
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
139
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
140
+
141
+ // move all invested underlying back to the vault
142
+ await strategy.withdrawAllToVault({ from: governance });
143
+
144
+ // strategy has no underlying left
145
+ let investedUnderlyingBalanceNew = new BigNumber(await strategy.investedUnderlyingBalance());
146
+ assert.equal(investedUnderlyingBalanceNew.eq(BigNumber(0)), true);
147
+
148
+ // vault has all of the underlying from the strategy
149
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
150
+ Utils.assertBNGte(vaultUnderlyingNew, investedUnderlyingBalance)
151
+ });
152
+
153
+ it("withdrawToVault(uint256 _amount)", async function () {
154
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
155
+ // doHardwork invests all underlying from the vault
156
+ await controller.doHardWork(vault.address, { from: governance });
157
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
158
+
159
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
160
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
161
+
162
+ let amount = 1;
163
+ // move amount of underlying to vault
164
+ await strategy.withdrawToVault(amount, { from: governance });
165
+
166
+ // vault has exactly amount of underlying
167
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
168
+ assert.equal(new BigNumber(amount).eq(vaultUnderlyingNew), true);
169
+ });
170
+
171
+ it("unsalvagableTokens(address _token)", async function () {
172
+ // underlying is unsalvageable
173
+ let isUnderlyingUnsalvagable = await strategy.unsalvagableTokens(underlying.address);
174
+ assert.equal(isUnderlyingUnsalvagable, true);
175
+
176
+ // rewardToken is unsalvageable
177
+ let isRewardTokenUnsalvagable = await strategy.unsalvagableTokens(await strategy.rewardToken());
178
+ assert.equal(isRewardTokenUnsalvagable, true);
179
+
180
+ });
181
+
182
+ it("Remove all deposited LP tokens", async function () {
183
+ // remove all deposited LP tokens
184
+ let fTokenBalance = await vault.balanceOf(farmer1);
185
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
186
+
187
+ //check that there is nothing left in the strategy or vault
188
+ let strategyBalance = new BigNumber(await underlying.balanceOf(strategy.address));
189
+ assert.equal(strategyBalance.eq(BigNumber(0)), true);
190
+
191
+ let vaultBalance = new BigNumber(await underlying.balanceOf(vault.address));
192
+ assert.equal(vaultBalance.eq(BigNumber(0)), true);
193
+
194
+ let totalUnderlyingVaultAndStrategy = new BigNumber(await vault.underlyingBalanceWithInvestment());
195
+ assert.equal(totalUnderlyingVaultAndStrategy.eq(BigNumber(0)), true);
196
+ });
197
+ });
198
+
199
+ });
@@ -0,0 +1,209 @@
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("QuickGammaStrategyV2Mainnet_USDC_DAI");
10
+
11
+ //This test was developed at blockNumber 48397851
12
+
13
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
14
+ describe("Mainnet Quickswap-Gamma USDC-DAI", function() {
15
+ let accounts;
16
+
17
+ // external contracts
18
+ let underlying;
19
+
20
+ // external setup
21
+ let underlyingWhale = "0x2ee901d6AAb21Aa32e50AD15779201C2D6637092";
22
+ let quick = "0xB5C064F955D8e7F38fE0460C556a72987494eE17";
23
+ let weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
24
+ let usdc = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
25
+ let dai = "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063";
26
+
27
+ // parties in the protocol
28
+ let governance;
29
+ let farmer1;
30
+
31
+ // numbers used in tests
32
+ let farmerBalance;
33
+
34
+ // Core protocol contracts
35
+ let controller;
36
+ let vault;
37
+ let strategy;
38
+
39
+ async function setupExternalContracts() {
40
+ underlying = await IERC20.at("0x9E31214Db6931727B7d63a0D2b6236DB455c0965");
41
+ console.log("Fetching Underlying at: ", underlying.address);
42
+ }
43
+
44
+ async function setupBalance(){
45
+ let etherGiver = accounts[9];
46
+ // Give whale some ether to make sure the following actions are good
47
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 100e18});
48
+
49
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
50
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
51
+ }
52
+
53
+ before(async function() {
54
+ governance = addresses.Governance;
55
+ accounts = await web3.eth.getAccounts();
56
+
57
+ farmer1 = accounts[1];
58
+
59
+ // impersonate accounts
60
+ await impersonates([governance, underlyingWhale]);
61
+
62
+ let etherGiver = accounts[9];
63
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 100e18});
64
+
65
+ await setupExternalContracts();
66
+ [controller, vault, strategy] = await setupCoreProtocol({
67
+ "existingVaultAddress": null,
68
+ "strategyArtifact": Strategy,
69
+ "strategyArtifactIsUpgradable": true,
70
+ "underlying": underlying,
71
+ "governance": governance,
72
+ "liquidation": [
73
+ {"quickswap": [quick, weth]},
74
+ {"uniV3": [weth, usdc]},
75
+ {"uniV3": [weth, dai]},
76
+ ],
77
+ });
78
+
79
+ // whale send underlying to farmers
80
+ await setupBalance();
81
+ });
82
+
83
+ describe("Happy path", function() {
84
+ it("Farmer should earn money", async function() {
85
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
86
+ console.log("Farmer old balance:", farmerOldBalance.toFixed());
87
+ await depositVault(farmer1, underlying, vault, farmerBalance);
88
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
89
+ console.log("Farmer fToken balance:", fTokenBalance.toFixed());
90
+
91
+ // Using half days is to simulate how we doHardwork in the real world
92
+ let hours = 10;
93
+ let blocksPerHour = 1565*5;
94
+ let oldSharePrice;
95
+ let newSharePrice;
96
+ for (let i = 0; i < hours; i++) {
97
+ console.log("loop ", i);
98
+
99
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
100
+ await controller.doHardWork(vault.address, { from: governance });
101
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
102
+
103
+ console.log("old shareprice: ", oldSharePrice.toFixed());
104
+ console.log("new shareprice: ", newSharePrice.toFixed());
105
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
106
+
107
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))*365;
108
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
109
+
110
+ console.log("instant APR:", apr*100, "%");
111
+ console.log("instant APY:", (apy-1)*100, "%");
112
+
113
+ await Utils.advanceNBlock(blocksPerHour);
114
+ }
115
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
116
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
117
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
118
+
119
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
120
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
121
+
122
+ console.log("earned!");
123
+ console.log("Overall APR:", apr*100, "%");
124
+ console.log("Overall APY:", (apy-1)*100, "%");
125
+
126
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
127
+ });
128
+ });
129
+
130
+
131
+
132
+ describe("Basic strategy functionality checks", function () {
133
+ it("Deposit to vault", async function () {
134
+ // deposit to vault such that we have something to work with
135
+ await depositVault(farmer1, underlying, vault, farmerBalance);
136
+
137
+ // check vault has at least farmerBalance (there could be some dust etc., so no exact check)
138
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
139
+ Utils.assertBNGte(vaultUnderlying, farmerBalance)
140
+ });
141
+
142
+ it("withdrawAllToVault()", async function () {
143
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
144
+ // doHardwork invests all underlying from the vault
145
+ await controller.doHardWork(vault.address, { from: governance });
146
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
147
+
148
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
149
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
150
+
151
+ // move all invested underlying back to the vault
152
+ await strategy.withdrawAllToVault({ from: governance });
153
+
154
+ // strategy has no underlying left
155
+ let investedUnderlyingBalanceNew = new BigNumber(await strategy.investedUnderlyingBalance());
156
+ assert.equal(investedUnderlyingBalanceNew.eq(BigNumber(0)), true);
157
+
158
+ // vault has all of the underlying from the strategy
159
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
160
+ Utils.assertBNGte(vaultUnderlyingNew, investedUnderlyingBalance)
161
+ });
162
+
163
+ it("withdrawToVault(uint256 _amount)", async function () {
164
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
165
+ // doHardwork invests all underlying from the vault
166
+ await controller.doHardWork(vault.address, { from: governance });
167
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
168
+
169
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
170
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
171
+
172
+ let amount = 1;
173
+ // move amount of underlying to vault
174
+ await strategy.withdrawToVault(amount, { from: governance });
175
+
176
+ // vault has exactly amount of underlying
177
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
178
+ assert.equal(new BigNumber(amount).eq(vaultUnderlyingNew), true);
179
+ });
180
+
181
+ it("unsalvagableTokens(address _token)", async function () {
182
+ // underlying is unsalvageable
183
+ let isUnderlyingUnsalvagable = await strategy.unsalvagableTokens(underlying.address);
184
+ assert.equal(isUnderlyingUnsalvagable, true);
185
+
186
+ // rewardToken is unsalvageable
187
+ let isRewardTokenUnsalvagable = await strategy.unsalvagableTokens(await strategy.rewardToken());
188
+ assert.equal(isRewardTokenUnsalvagable, true);
189
+
190
+ });
191
+
192
+ it("Remove all deposited LP tokens", async function () {
193
+ // remove all deposited LP tokens
194
+ let fTokenBalance = await vault.balanceOf(farmer1);
195
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
196
+
197
+ //check that there is nothing left in the strategy or vault
198
+ let strategyBalance = new BigNumber(await underlying.balanceOf(strategy.address));
199
+ assert.equal(strategyBalance.eq(BigNumber(0)), true);
200
+
201
+ let vaultBalance = new BigNumber(await underlying.balanceOf(vault.address));
202
+ assert.equal(vaultBalance.eq(BigNumber(0)), true);
203
+
204
+ let totalUnderlyingVaultAndStrategy = new BigNumber(await vault.underlyingBalanceWithInvestment());
205
+ assert.equal(totalUnderlyingVaultAndStrategy.eq(BigNumber(0)), true);
206
+ });
207
+ });
208
+
209
+ });
@@ -0,0 +1,197 @@
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("QuickGammaStrategyMainnet_USDC_ETH_narrow");
10
+
11
+ //This test was developed at blockNumber 39013300
12
+
13
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
14
+ describe("Mainnet Quickswap-Gamma USDC-ETH (narrow)", function() {
15
+ let accounts;
16
+
17
+ // external contracts
18
+ let underlying;
19
+
20
+ // external setup
21
+ let underlyingWhale = "0xff03eD274E15ae69dBA15321DfeC1c5e9d45Efa5";
22
+
23
+ // parties in the protocol
24
+ let governance;
25
+ let farmer1;
26
+
27
+ // numbers used in tests
28
+ let farmerBalance;
29
+
30
+ // Core protocol contracts
31
+ let controller;
32
+ let vault;
33
+ let strategy;
34
+
35
+ async function setupExternalContracts() {
36
+ underlying = await IERC20.at("0x3Cc20A6795c4b57d9817399F68E83e71C8626580");
37
+ console.log("Fetching Underlying at: ", underlying.address);
38
+ }
39
+
40
+ async function setupBalance(){
41
+ let etherGiver = accounts[9];
42
+ // Give whale some ether to make sure the following actions are good
43
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 1e18});
44
+
45
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
46
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
47
+ }
48
+
49
+ before(async function() {
50
+ governance = "0xf00dD244228F51547f0563e60bCa65a30FBF5f7f";
51
+ accounts = await web3.eth.getAccounts();
52
+
53
+ farmer1 = accounts[1];
54
+
55
+ // impersonate accounts
56
+ await impersonates([governance, underlyingWhale]);
57
+
58
+ await setupExternalContracts();
59
+ [controller, vault, strategy] = await setupCoreProtocol({
60
+ "existingVaultAddress": null,
61
+ "strategyArtifact": Strategy,
62
+ "strategyArtifactIsUpgradable": true,
63
+ "underlying": underlying,
64
+ "governance": governance,
65
+ });
66
+
67
+ // whale send underlying to farmers
68
+ await setupBalance();
69
+ });
70
+
71
+ describe("Happy path", function() {
72
+ it("Farmer should earn money", async function() {
73
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
74
+ console.log("Farmer old balance:", farmerOldBalance.toFixed());
75
+ await depositVault(farmer1, underlying, vault, farmerBalance);
76
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
77
+ console.log("Farmer fToken balance:", fTokenBalance.toFixed());
78
+
79
+ // Using half days is to simulate how we doHardwork in the real world
80
+ let hours = 10;
81
+ let blocksPerHour = 1565*5;
82
+ let oldSharePrice;
83
+ let newSharePrice;
84
+ for (let i = 0; i < hours; i++) {
85
+ console.log("loop ", i);
86
+
87
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
88
+ await controller.doHardWork(vault.address, { from: governance });
89
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
90
+
91
+ console.log("old shareprice: ", oldSharePrice.toFixed());
92
+ console.log("new shareprice: ", newSharePrice.toFixed());
93
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
94
+
95
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))*365;
96
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
97
+
98
+ console.log("instant APR:", apr*100, "%");
99
+ console.log("instant APY:", (apy-1)*100, "%");
100
+
101
+ await Utils.advanceNBlock(blocksPerHour);
102
+ }
103
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
104
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
105
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
106
+
107
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
108
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
109
+
110
+ console.log("earned!");
111
+ console.log("Overall APR:", apr*100, "%");
112
+ console.log("Overall APY:", (apy-1)*100, "%");
113
+
114
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
115
+ });
116
+ });
117
+
118
+
119
+
120
+ describe("Basic strategy functionality checks", function () {
121
+ it("Deposit to vault", async function () {
122
+ // deposit to vault such that we have something to work with
123
+ await depositVault(farmer1, underlying, vault, farmerBalance);
124
+
125
+ // check vault has at least farmerBalance (there could be some dust etc., so no exact check)
126
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
127
+ Utils.assertBNGte(vaultUnderlying, farmerBalance)
128
+ });
129
+
130
+ it("withdrawAllToVault()", async function () {
131
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
132
+ // doHardwork invests all underlying from the vault
133
+ await controller.doHardWork(vault.address, { from: governance });
134
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
135
+
136
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
137
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
138
+
139
+ // move all invested underlying back to the vault
140
+ await strategy.withdrawAllToVault({ from: governance });
141
+
142
+ // strategy has no underlying left
143
+ let investedUnderlyingBalanceNew = new BigNumber(await strategy.investedUnderlyingBalance());
144
+ assert.equal(investedUnderlyingBalanceNew.eq(BigNumber(0)), true);
145
+
146
+ // vault has all of the underlying from the strategy
147
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
148
+ Utils.assertBNGte(vaultUnderlyingNew, investedUnderlyingBalance)
149
+ });
150
+
151
+ it("withdrawToVault(uint256 _amount)", async function () {
152
+ let vaultUnderlying = new BigNumber(await vault.underlyingBalanceInVault());
153
+ // doHardwork invests all underlying from the vault
154
+ await controller.doHardWork(vault.address, { from: governance });
155
+ let investedUnderlyingBalance = new BigNumber(await strategy.investedUnderlyingBalance());
156
+
157
+ // strategy invested amount must be greater or equal than the initial vault underlying amount
158
+ Utils.assertBNGte(investedUnderlyingBalance, vaultUnderlying)
159
+
160
+ let amount = 1;
161
+ // move amount of underlying to vault
162
+ await strategy.withdrawToVault(amount, { from: governance });
163
+
164
+ // vault has exactly amount of underlying
165
+ let vaultUnderlyingNew = new BigNumber(await vault.underlyingBalanceInVault());
166
+ assert.equal(new BigNumber(amount).eq(vaultUnderlyingNew), true);
167
+ });
168
+
169
+ it("unsalvagableTokens(address _token)", async function () {
170
+ // underlying is unsalvageable
171
+ let isUnderlyingUnsalvagable = await strategy.unsalvagableTokens(underlying.address);
172
+ assert.equal(isUnderlyingUnsalvagable, true);
173
+
174
+ // rewardToken is unsalvageable
175
+ let isRewardTokenUnsalvagable = await strategy.unsalvagableTokens(await strategy.rewardToken());
176
+ assert.equal(isRewardTokenUnsalvagable, true);
177
+
178
+ });
179
+
180
+ it("Remove all deposited LP tokens", async function () {
181
+ // remove all deposited LP tokens
182
+ let fTokenBalance = await vault.balanceOf(farmer1);
183
+ await vault.withdraw(fTokenBalance, { from: farmer1 });
184
+
185
+ //check that there is nothing left in the strategy or vault
186
+ let strategyBalance = new BigNumber(await underlying.balanceOf(strategy.address));
187
+ assert.equal(strategyBalance.eq(BigNumber(0)), true);
188
+
189
+ let vaultBalance = new BigNumber(await underlying.balanceOf(vault.address));
190
+ assert.equal(vaultBalance.eq(BigNumber(0)), true);
191
+
192
+ let totalUnderlyingVaultAndStrategy = new BigNumber(await vault.underlyingBalanceWithInvestment());
193
+ assert.equal(totalUnderlyingVaultAndStrategy.eq(BigNumber(0)), true);
194
+ });
195
+ });
196
+
197
+ });