@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,198 @@
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 { send } = require("@openzeppelin/test-helpers");
7
+ const BigNumber = require("bignumber.js");
8
+ const IERC20 = artifacts.require("@openzeppelin/contracts/token/ERC20/IERC20.sol:IERC20");
9
+
10
+ const HodlStrategy = artifacts.require("CaviarStrategyMainnet_CVR");
11
+ const Strategy = artifacts.require("PearlHodlStrategyMainnet_PEARL_USDR");
12
+
13
+ const D18 = new BigNumber(Math.pow(10, 18));
14
+
15
+ //This test was developed at blockNumber 47098070
16
+
17
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
18
+ describe("Mainnet Pearl PEARL-USDR HODL in CVR", function() {
19
+ let accounts;
20
+
21
+ // external contracts
22
+ let underlying;
23
+
24
+ // external setup
25
+ let underlyingWhale = "0x747276019e3340104C96397bF6537aD01F93D7df";
26
+ let hodlUnderlying = "0x6AE96Cc93331c19148541D4D2f31363684917092";
27
+ let cvr = "0x6AE96Cc93331c19148541D4D2f31363684917092";
28
+ let pearl = "0x7238390d5f6F64e67c3211C343A410E2A3DEc142";
29
+ let weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
30
+ let usdr = "0x40379a439D4F6795B6fc9aa5687dB461677A2dBa";
31
+
32
+ // parties in the protocol
33
+ let governance;
34
+ let farmer1;
35
+
36
+ // numbers used in tests
37
+ let farmerBalance;
38
+
39
+ // Core protocol contracts
40
+ let controller;
41
+ let vault;
42
+ let strategy;
43
+
44
+ async function setupExternalContracts() {
45
+ underlying = await IERC20.at("0xf68c20d6C50706f6C6bd8eE184382518C93B368c");
46
+ console.log("Fetching Underlying at: ", underlying.address);
47
+ }
48
+
49
+ async function setupBalance(){
50
+ let etherGiver = accounts[9];
51
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 10e18});
52
+
53
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
54
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
55
+ }
56
+
57
+ before(async function() {
58
+ governance = addresses.Governance;
59
+ accounts = await web3.eth.getAccounts();
60
+
61
+ farmer1 = accounts[1];
62
+
63
+ // impersonate accounts
64
+ await impersonates([governance, underlyingWhale]);
65
+
66
+ let etherGiver = accounts[9];
67
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 10e18});
68
+
69
+ await setupExternalContracts();
70
+ [controller, hodlVault, hodlStrategy] = await setupCoreProtocol({
71
+ "existingVaultAddress": null,
72
+ "strategyArtifact": HodlStrategy,
73
+ "strategyArtifactIsUpgradable": true,
74
+ "underlying": await IERC20.at(hodlUnderlying),
75
+ "governance": governance,
76
+ "liquidation": [
77
+ {"pearl": [cvr, pearl, usdr]},
78
+ {"pearl": [usdr, pearl, cvr]},
79
+ {"pearl": [usdr, weth]},
80
+ ]
81
+ });
82
+ [controller, vault, strategy, potPool] = await setupCoreProtocol({
83
+ "existingVaultAddress": null,
84
+ "strategyArtifact": Strategy,
85
+ "strategyArtifactIsUpgradable": true,
86
+ "underlying": underlying,
87
+ "governance": governance,
88
+ "rewardPool" : true,
89
+ "rewardPoolConfig": {
90
+ type: 'PotPool',
91
+ rewardTokens: [
92
+ hodlVault.address // fCVR
93
+ ]
94
+ },
95
+ "liquidation": [
96
+ {"pearl": [pearl, cvr]},
97
+ {"pearl": [pearl, usdr, weth]},
98
+ ]
99
+ });
100
+
101
+ await strategy.setHodlVault(hodlVault.address, {from: governance});
102
+ await strategy.setPotPool(potPool.address, {from: governance});
103
+ await potPool.setRewardDistribution([strategy.address], true, {from: governance});
104
+ await controller.addToWhitelist(strategy.address, {from: governance});
105
+
106
+ // whale send underlying to farmers
107
+ await setupBalance();
108
+ });
109
+
110
+ describe("Happy path", function() {
111
+ it("Farmer should earn money", async function() {
112
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
113
+ let farmerOldHodlBalance = new BigNumber(await hodlVault.balanceOf(farmer1));
114
+ await depositVault(farmer1, underlying, vault, farmerBalance);
115
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
116
+
117
+ let erc20Vault = await IERC20.at(vault.address);
118
+ await erc20Vault.approve(potPool.address, fTokenBalance, {from: farmer1});
119
+ await potPool.stake(fTokenBalance, {from: farmer1});
120
+
121
+ // Using half days is to simulate how we doHardwork in the real world
122
+ let hours = 10;
123
+ let blocksPerHour = 1565*5;
124
+ let oldSharePrice;
125
+ let newSharePrice;
126
+ let oldHodlSharePrice;
127
+ let newHodlSharePrice;
128
+ let oldPotPoolBalance;
129
+ let newPotPoolBalance;
130
+ let hodlPrice;
131
+ let lpPrice;
132
+ let oldValue;
133
+ let newValue;
134
+ for (let i = 0; i < hours; i++) {
135
+ console.log("loop ", i);
136
+
137
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
138
+ oldHodlSharePrice = new BigNumber(await hodlVault.getPricePerFullShare());
139
+ oldPotPoolBalance = new BigNumber(await hodlVault.balanceOf(potPool.address));
140
+ await controller.doHardWork(vault.address, {from: governance});
141
+ await controller.doHardWork(hodlVault.address, {from: governance});
142
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
143
+ newHodlSharePrice = new BigNumber(await hodlVault.getPricePerFullShare());
144
+ newPotPoolBalance = new BigNumber(await hodlVault.balanceOf(potPool.address));
145
+
146
+ hodlPrice = new BigNumber(0.334770).times(D18);
147
+ lpPrice = new BigNumber(2101271.71428).times(D18);
148
+ console.log("Hodl price:", hodlPrice.toFixed()/D18.toFixed());
149
+ console.log("LP price:", lpPrice.toFixed()/D18.toFixed());
150
+
151
+ oldValue = (fTokenBalance.times(oldSharePrice).times(lpPrice)).div(1e36).plus((oldPotPoolBalance.times(oldHodlSharePrice).times(hodlPrice)).div(1e36));
152
+ newValue = (fTokenBalance.times(newSharePrice).times(lpPrice)).div(1e36).plus((newPotPoolBalance.times(newHodlSharePrice).times(hodlPrice)).div(1e36));
153
+
154
+ console.log("old value: ", oldValue.toFixed()/D18.toFixed());
155
+ console.log("new value: ", newValue.toFixed()/D18.toFixed());
156
+ console.log("growth: ", newValue.toFixed() / oldValue.toFixed());
157
+
158
+ console.log("HODL token in potpool: ", newPotPoolBalance.toFixed());
159
+
160
+ apr = (newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour/1565))*365;
161
+ apy = ((newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
162
+
163
+ console.log("instant APR:", apr*100, "%");
164
+ console.log("instant APY:", (apy-1)*100, "%");
165
+
166
+ await Utils.advanceNBlock(blocksPerHour);
167
+ }
168
+ // withdrawAll to make sure no doHardwork is called when we do withdraw later.
169
+ await vault.withdrawAll({ from: governance });
170
+
171
+ // wait until all reward can be claimed by the farmer
172
+ await Utils.waitTime(86400 * 30 * 1000);
173
+ console.log("vaultBalance: ", fTokenBalance.toFixed());
174
+ await potPool.exit({from: farmer1});
175
+ await vault.withdraw(fTokenBalance.toFixed(), { from: farmer1 });
176
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
177
+ let farmerNewHodlBalance = new BigNumber(await hodlVault.balanceOf(farmer1));
178
+ Utils.assertBNGte(farmerNewBalance, farmerOldBalance);
179
+ Utils.assertBNGt(farmerNewHodlBalance, farmerOldHodlBalance);
180
+
181
+ oldValue = (fTokenBalance.times(1e18).times(lpPrice)).div(1e36);
182
+ newValue = (fTokenBalance.times(newSharePrice).times(lpPrice)).div(1e36).plus((farmerNewHodlBalance.times(newHodlSharePrice).times(hodlPrice)).div(1e36));
183
+
184
+ apr = (newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
185
+ apy = ((newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
186
+
187
+ console.log("Overall APR:", apr*100, "%");
188
+ console.log("Overall APY:", (apy-1)*100, "%");
189
+
190
+ console.log("potpool totalShare: ", (new BigNumber(await potPool.totalSupply())).toFixed());
191
+ console.log("HODL token in potpool: ", (new BigNumber(await hodlVault.balanceOf(potPool.address))).toFixed() );
192
+ console.log("Farmer got HODL token from potpool: ", farmerNewHodlBalance.toFixed());
193
+ console.log("earned!");
194
+
195
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
196
+ });
197
+ });
198
+ });
@@ -0,0 +1,186 @@
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 { send } = require("@openzeppelin/test-helpers");
7
+ const BigNumber = require("bignumber.js");
8
+ const { artifacts } = require("hardhat");
9
+ const IERC20 = artifacts.require("@openzeppelin/contracts/token/ERC20/IERC20.sol:IERC20");
10
+
11
+ const HOdlVault = artifacts.require("Vault")
12
+ const Strategy = artifacts.require("PearlHodlStrategyMainnet_STAR_USDR");
13
+
14
+ const D18 = new BigNumber(Math.pow(10, 18));
15
+
16
+ //This test was developed at blockNumber 48246300
17
+
18
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
19
+ describe("Mainnet Pearl STAR-USDR HODL in CVR", function() {
20
+ let accounts;
21
+
22
+ // external contracts
23
+ let underlying;
24
+
25
+ // external setup
26
+ let underlyingWhale = "0x04526c8Eb172CEe7814aEF2AE02046b71fdf9125";
27
+ let hodlvaultAddr = "0xCB2f2895208c36F38c9B13aB0C9e49Ad69B14e9d";
28
+ let cvr = "0x6AE96Cc93331c19148541D4D2f31363684917092";
29
+ let pearl = "0x7238390d5f6F64e67c3211C343A410E2A3DEc142";
30
+ let weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
31
+ let usdr = "0x40379a439D4F6795B6fc9aa5687dB461677A2dBa";
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
+ let hodlVault;
45
+
46
+ async function setupExternalContracts() {
47
+ underlying = await IERC20.at("0x366dc82D3BFFd482cc405E58bAb3288F2dd32C94");
48
+ hodlVault = await HOdlVault.at(hodlvaultAddr);
49
+ console.log("Fetching Underlying at: ", underlying.address);
50
+ }
51
+
52
+ async function setupBalance(){
53
+ let etherGiver = accounts[9];
54
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 10e18});
55
+
56
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
57
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
58
+ }
59
+
60
+ before(async function() {
61
+ governance = addresses.Governance;
62
+ accounts = await web3.eth.getAccounts();
63
+
64
+ farmer1 = accounts[1];
65
+
66
+ // impersonate accounts
67
+ await impersonates([governance, underlyingWhale, addresses.ULOwner]);
68
+
69
+ let etherGiver = accounts[9];
70
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 10e18});
71
+
72
+ await setupExternalContracts();
73
+
74
+ [controller, vault, strategy, potPool] = await setupCoreProtocol({
75
+ "existingVaultAddress": null,
76
+ "strategyArtifact": Strategy,
77
+ "strategyArtifactIsUpgradable": true,
78
+ "underlying": underlying,
79
+ "governance": governance,
80
+ "rewardPool" : true,
81
+ "rewardPoolConfig": {
82
+ type: 'PotPool',
83
+ rewardTokens: [
84
+ hodlvaultAddr // fCVR
85
+ ]
86
+ },
87
+ "ULOwner": addresses.ULOwner
88
+ });
89
+
90
+ await strategy.setPotPool(potPool.address, {from: governance});
91
+ await potPool.setRewardDistribution([strategy.address], true, {from: governance});
92
+ await controller.addToWhitelist(strategy.address, {from: governance});
93
+
94
+ // whale send underlying to farmers
95
+ await setupBalance();
96
+ });
97
+
98
+ describe("Happy path", function() {
99
+ it("Farmer should earn money", async function() {
100
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
101
+ let farmerOldHodlBalance = new BigNumber(await hodlVault.balanceOf(farmer1));
102
+ await depositVault(farmer1, underlying, vault, farmerBalance);
103
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
104
+
105
+ let erc20Vault = await IERC20.at(vault.address);
106
+ await erc20Vault.approve(potPool.address, fTokenBalance, {from: farmer1});
107
+ await potPool.stake(fTokenBalance, {from: farmer1});
108
+
109
+ // Using half days is to simulate how we doHardwork in the real world
110
+ let hours = 10;
111
+ let blocksPerHour = 1565*5;
112
+ let oldSharePrice;
113
+ let newSharePrice;
114
+ let oldHodlSharePrice;
115
+ let newHodlSharePrice;
116
+ let oldPotPoolBalance;
117
+ let newPotPoolBalance;
118
+ let hodlPrice;
119
+ let lpPrice;
120
+ let oldValue;
121
+ let newValue;
122
+ for (let i = 0; i < hours; i++) {
123
+ console.log("loop ", i);
124
+
125
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
126
+ oldHodlSharePrice = new BigNumber(await hodlVault.getPricePerFullShare());
127
+ oldPotPoolBalance = new BigNumber(await hodlVault.balanceOf(potPool.address));
128
+ await controller.doHardWork(vault.address, {from: governance});
129
+ await controller.doHardWork(hodlVault.address, {from: governance});
130
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
131
+ newHodlSharePrice = new BigNumber(await hodlVault.getPricePerFullShare());
132
+ newPotPoolBalance = new BigNumber(await hodlVault.balanceOf(potPool.address));
133
+
134
+ hodlPrice = new BigNumber(0.400909).times(D18);
135
+ lpPrice = new BigNumber(66050.967243).times(D18);
136
+ console.log("Hodl price:", hodlPrice.toFixed()/D18.toFixed());
137
+ console.log("LP price:", lpPrice.toFixed()/D18.toFixed());
138
+
139
+ oldValue = (fTokenBalance.times(oldSharePrice).times(lpPrice)).div(1e36).plus((oldPotPoolBalance.times(oldHodlSharePrice).times(hodlPrice)).div(1e36));
140
+ newValue = (fTokenBalance.times(newSharePrice).times(lpPrice)).div(1e36).plus((newPotPoolBalance.times(newHodlSharePrice).times(hodlPrice)).div(1e36));
141
+
142
+ console.log("old value: ", oldValue.toFixed()/D18.toFixed());
143
+ console.log("new value: ", newValue.toFixed()/D18.toFixed());
144
+ console.log("growth: ", newValue.toFixed() / oldValue.toFixed());
145
+
146
+ console.log("HODL token in potpool: ", newPotPoolBalance.toFixed());
147
+
148
+ apr = (newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour/1565))*365;
149
+ apy = ((newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
150
+
151
+ console.log("instant APR:", apr*100, "%");
152
+ console.log("instant APY:", (apy-1)*100, "%");
153
+
154
+ await Utils.advanceNBlock(blocksPerHour);
155
+ }
156
+ // withdrawAll to make sure no doHardwork is called when we do withdraw later.
157
+ await vault.withdrawAll({ from: governance });
158
+
159
+ // wait until all reward can be claimed by the farmer
160
+ await Utils.waitTime(86400 * 30 * 1000);
161
+ console.log("vaultBalance: ", fTokenBalance.toFixed());
162
+ await potPool.exit({from: farmer1});
163
+ await vault.withdraw(fTokenBalance.toFixed(), { from: farmer1 });
164
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
165
+ let farmerNewHodlBalance = new BigNumber(await hodlVault.balanceOf(farmer1));
166
+ Utils.assertBNGte(farmerNewBalance, farmerOldBalance);
167
+ Utils.assertBNGt(farmerNewHodlBalance, farmerOldHodlBalance);
168
+
169
+ oldValue = (fTokenBalance.times(1e18).times(lpPrice)).div(1e36);
170
+ newValue = (fTokenBalance.times(newSharePrice).times(lpPrice)).div(1e36).plus((farmerNewHodlBalance.times(newHodlSharePrice).times(hodlPrice)).div(1e36));
171
+
172
+ apr = (newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
173
+ apy = ((newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
174
+
175
+ console.log("Overall APR:", apr*100, "%");
176
+ console.log("Overall APY:", (apy-1)*100, "%");
177
+
178
+ console.log("potpool totalShare: ", (new BigNumber(await potPool.totalSupply())).toFixed());
179
+ console.log("HODL token in potpool: ", (new BigNumber(await hodlVault.balanceOf(potPool.address))).toFixed() );
180
+ console.log("Farmer got HODL token from potpool: ", farmerNewHodlBalance.toFixed());
181
+ console.log("earned!");
182
+
183
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
184
+ });
185
+ });
186
+ });
@@ -0,0 +1,198 @@
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 { send } = require("@openzeppelin/test-helpers");
7
+ const BigNumber = require("bignumber.js");
8
+ const IERC20 = artifacts.require("@openzeppelin/contracts/token/ERC20/IERC20.sol:IERC20");
9
+
10
+ const HodlStrategy = artifacts.require("CaviarStrategyMainnet_CVR");
11
+ const Strategy = artifacts.require("PearlHodlStrategyMainnet_TNGBL_USDR");
12
+
13
+ const D18 = new BigNumber(Math.pow(10, 18));
14
+
15
+ //This test was developed at blockNumber 47098070
16
+
17
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
18
+ describe("Mainnet Pearl TNGBL-USDR HODL in CVR", function() {
19
+ let accounts;
20
+
21
+ // external contracts
22
+ let underlying;
23
+
24
+ // external setup
25
+ let underlyingWhale = "0x717CC576496acb1CC4c037174034eE895A9Eb829";
26
+ let hodlUnderlying = "0x6AE96Cc93331c19148541D4D2f31363684917092";
27
+ let cvr = "0x6AE96Cc93331c19148541D4D2f31363684917092";
28
+ let pearl = "0x7238390d5f6F64e67c3211C343A410E2A3DEc142";
29
+ let weth = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";
30
+ let usdr = "0x40379a439D4F6795B6fc9aa5687dB461677A2dBa";
31
+
32
+ // parties in the protocol
33
+ let governance;
34
+ let farmer1;
35
+
36
+ // numbers used in tests
37
+ let farmerBalance;
38
+
39
+ // Core protocol contracts
40
+ let controller;
41
+ let vault;
42
+ let strategy;
43
+
44
+ async function setupExternalContracts() {
45
+ underlying = await IERC20.at("0x0Edc235693C20943780b76D79DD763236E94C751");
46
+ console.log("Fetching Underlying at: ", underlying.address);
47
+ }
48
+
49
+ async function setupBalance(){
50
+ let etherGiver = accounts[9];
51
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 10e18});
52
+
53
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
54
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
55
+ }
56
+
57
+ before(async function() {
58
+ governance = addresses.Governance;
59
+ accounts = await web3.eth.getAccounts();
60
+
61
+ farmer1 = accounts[1];
62
+
63
+ // impersonate accounts
64
+ await impersonates([governance, underlyingWhale]);
65
+
66
+ let etherGiver = accounts[9];
67
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 10e18});
68
+
69
+ await setupExternalContracts();
70
+ [controller, hodlVault, hodlStrategy] = await setupCoreProtocol({
71
+ "existingVaultAddress": null,
72
+ "strategyArtifact": HodlStrategy,
73
+ "strategyArtifactIsUpgradable": true,
74
+ "underlying": await IERC20.at(hodlUnderlying),
75
+ "governance": governance,
76
+ "liquidation": [
77
+ {"pearl": [cvr, pearl, usdr]},
78
+ {"pearl": [usdr, pearl, cvr]},
79
+ {"pearl": [usdr, weth]},
80
+ ]
81
+ });
82
+ [controller, vault, strategy, potPool] = await setupCoreProtocol({
83
+ "existingVaultAddress": null,
84
+ "strategyArtifact": Strategy,
85
+ "strategyArtifactIsUpgradable": true,
86
+ "underlying": underlying,
87
+ "governance": governance,
88
+ "rewardPool" : true,
89
+ "rewardPoolConfig": {
90
+ type: 'PotPool',
91
+ rewardTokens: [
92
+ hodlVault.address // fCVR
93
+ ]
94
+ },
95
+ "liquidation": [
96
+ {"pearl": [pearl, cvr]},
97
+ {"pearl": [pearl, usdr, weth]},
98
+ ]
99
+ });
100
+
101
+ await strategy.setHodlVault(hodlVault.address, {from: governance});
102
+ await strategy.setPotPool(potPool.address, {from: governance});
103
+ await potPool.setRewardDistribution([strategy.address], true, {from: governance});
104
+ await controller.addToWhitelist(strategy.address, {from: governance});
105
+
106
+ // whale send underlying to farmers
107
+ await setupBalance();
108
+ });
109
+
110
+ describe("Happy path", function() {
111
+ it("Farmer should earn money", async function() {
112
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
113
+ let farmerOldHodlBalance = new BigNumber(await hodlVault.balanceOf(farmer1));
114
+ await depositVault(farmer1, underlying, vault, farmerBalance);
115
+ let fTokenBalance = new BigNumber(await vault.balanceOf(farmer1));
116
+
117
+ let erc20Vault = await IERC20.at(vault.address);
118
+ await erc20Vault.approve(potPool.address, fTokenBalance, {from: farmer1});
119
+ await potPool.stake(fTokenBalance, {from: farmer1});
120
+
121
+ // Using half days is to simulate how we doHardwork in the real world
122
+ let hours = 10;
123
+ let blocksPerHour = 1565*5;
124
+ let oldSharePrice;
125
+ let newSharePrice;
126
+ let oldHodlSharePrice;
127
+ let newHodlSharePrice;
128
+ let oldPotPoolBalance;
129
+ let newPotPoolBalance;
130
+ let hodlPrice;
131
+ let lpPrice;
132
+ let oldValue;
133
+ let newValue;
134
+ for (let i = 0; i < hours; i++) {
135
+ console.log("loop ", i);
136
+
137
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
138
+ oldHodlSharePrice = new BigNumber(await hodlVault.getPricePerFullShare());
139
+ oldPotPoolBalance = new BigNumber(await hodlVault.balanceOf(potPool.address));
140
+ await controller.doHardWork(vault.address, {from: governance});
141
+ await controller.doHardWork(hodlVault.address, {from: governance});
142
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
143
+ newHodlSharePrice = new BigNumber(await hodlVault.getPricePerFullShare());
144
+ newPotPoolBalance = new BigNumber(await hodlVault.balanceOf(potPool.address));
145
+
146
+ hodlPrice = new BigNumber(0.334770).times(D18);
147
+ lpPrice = new BigNumber(201996.395638).times(D18);
148
+ console.log("Hodl price:", hodlPrice.toFixed()/D18.toFixed());
149
+ console.log("LP price:", lpPrice.toFixed()/D18.toFixed());
150
+
151
+ oldValue = (fTokenBalance.times(oldSharePrice).times(lpPrice)).div(1e36).plus((oldPotPoolBalance.times(oldHodlSharePrice).times(hodlPrice)).div(1e36));
152
+ newValue = (fTokenBalance.times(newSharePrice).times(lpPrice)).div(1e36).plus((newPotPoolBalance.times(newHodlSharePrice).times(hodlPrice)).div(1e36));
153
+
154
+ console.log("old value: ", oldValue.toFixed()/D18.toFixed());
155
+ console.log("new value: ", newValue.toFixed()/D18.toFixed());
156
+ console.log("growth: ", newValue.toFixed() / oldValue.toFixed());
157
+
158
+ console.log("HODL token in potpool: ", newPotPoolBalance.toFixed());
159
+
160
+ apr = (newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour/1565))*365;
161
+ apy = ((newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour/1565))+1)**365;
162
+
163
+ console.log("instant APR:", apr*100, "%");
164
+ console.log("instant APY:", (apy-1)*100, "%");
165
+
166
+ await Utils.advanceNBlock(blocksPerHour);
167
+ }
168
+ // withdrawAll to make sure no doHardwork is called when we do withdraw later.
169
+ await vault.withdrawAll({ from: governance });
170
+
171
+ // wait until all reward can be claimed by the farmer
172
+ await Utils.waitTime(86400 * 30 * 1000);
173
+ console.log("vaultBalance: ", fTokenBalance.toFixed());
174
+ await potPool.exit({from: farmer1});
175
+ await vault.withdraw(fTokenBalance.toFixed(), { from: farmer1 });
176
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
177
+ let farmerNewHodlBalance = new BigNumber(await hodlVault.balanceOf(farmer1));
178
+ Utils.assertBNGte(farmerNewBalance, farmerOldBalance);
179
+ Utils.assertBNGt(farmerNewHodlBalance, farmerOldHodlBalance);
180
+
181
+ oldValue = (fTokenBalance.times(1e18).times(lpPrice)).div(1e36);
182
+ newValue = (fTokenBalance.times(newSharePrice).times(lpPrice)).div(1e36).plus((farmerNewHodlBalance.times(newHodlSharePrice).times(hodlPrice)).div(1e36));
183
+
184
+ apr = (newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour*hours/1565))*365;
185
+ apy = ((newValue.toFixed()/oldValue.toFixed()-1)*(24/(blocksPerHour*hours/1565))+1)**365;
186
+
187
+ console.log("Overall APR:", apr*100, "%");
188
+ console.log("Overall APY:", (apy-1)*100, "%");
189
+
190
+ console.log("potpool totalShare: ", (new BigNumber(await potPool.totalSupply())).toFixed());
191
+ console.log("HODL token in potpool: ", (new BigNumber(await hodlVault.balanceOf(potPool.address))).toFixed() );
192
+ console.log("Farmer got HODL token from potpool: ", farmerNewHodlBalance.toFixed());
193
+ console.log("earned!");
194
+
195
+ await strategy.withdrawAllToVault({ from: governance }); // making sure can withdraw all for a next switch
196
+ });
197
+ });
198
+ });