@harvest-finance/harvest-strategy-arbitrum 0.0.1-security → 1.0.1

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-arbitrum might be problematic. Click here for more details.

Files changed (199) hide show
  1. package/README.md +127 -5
  2. package/contracts/base/Controller.sol +358 -0
  3. package/contracts/base/Drip.sol +86 -0
  4. package/contracts/base/PotPool.sol +367 -0
  5. package/contracts/base/ProfitSharingReceiver.sol +38 -0
  6. package/contracts/base/Reader.sol +54 -0
  7. package/contracts/base/RewardForwarder.sol +109 -0
  8. package/contracts/base/VaultProxy.sol +34 -0
  9. package/contracts/base/VaultStorage.sol +205 -0
  10. package/contracts/base/VaultV1.sol +371 -0
  11. package/contracts/base/VaultV1GMX.sol +465 -0
  12. package/contracts/base/VaultV2.sol +111 -0
  13. package/contracts/base/VaultV2GMX.sol +111 -0
  14. package/contracts/base/factory/MegaFactory.sol +120 -0
  15. package/contracts/base/factory/interface/IPoolFactory.sol +6 -0
  16. package/contracts/base/factory/interface/IStrategyFactory.sol +6 -0
  17. package/contracts/base/factory/interface/IVaultFactory.sol +7 -0
  18. package/contracts/base/factory/pool/PotPoolFactory.sol +41 -0
  19. package/contracts/base/factory/strategy/UpgradableStrategyFactory.sol +19 -0
  20. package/contracts/base/factory/vault/RegularVaultFactory.sol +34 -0
  21. package/contracts/base/incentives/GlobalIncentivesExecutor.sol +85 -0
  22. package/contracts/base/incentives/GlobalIncentivesHelper.sol +174 -0
  23. package/contracts/base/incentives/NotifyHelperGeneric.sol +61 -0
  24. package/contracts/base/incentives/NotifyHelperStateful.sol +290 -0
  25. package/contracts/base/incentives/ViewerNotifyHelperStateful.sol +25 -0
  26. package/contracts/base/inheritance/Controllable.sol +25 -0
  27. package/contracts/base/inheritance/ControllableInit.sol +30 -0
  28. package/contracts/base/inheritance/Governable.sol +28 -0
  29. package/contracts/base/inheritance/GovernableInit.sol +50 -0
  30. package/contracts/base/inheritance/IUpgradeSource.sol +7 -0
  31. package/contracts/base/inheritance/OwnableWhitelist.sol +17 -0
  32. package/contracts/base/inheritance/Storage.sol +35 -0
  33. package/contracts/base/interface/IBalDex.sol +7 -0
  34. package/contracts/base/interface/IController.sol +132 -0
  35. package/contracts/base/interface/IDex.sol +9 -0
  36. package/contracts/base/interface/IERC4626.sol +261 -0
  37. package/contracts/base/interface/IGMXStrategy.sol +37 -0
  38. package/contracts/base/interface/IGlobalIncentivesHelper.sol +6 -0
  39. package/contracts/base/interface/IPotPool.sol +70 -0
  40. package/contracts/base/interface/IProfitSharingReceiver.sol +9 -0
  41. package/contracts/base/interface/IRewardForwarder.sol +57 -0
  42. package/contracts/base/interface/IStrategy.sol +37 -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 +9 -0
  46. package/contracts/base/interface/IVault.sol +58 -0
  47. package/contracts/base/interface/IVaultGMX.sol +71 -0
  48. package/contracts/base/interface/aura/IAuraBaseRewardPool.sol +25 -0
  49. package/contracts/base/interface/aura/IAuraBooster.sol +17 -0
  50. package/contracts/base/interface/aura/IAuraDepositor.sol +7 -0
  51. package/contracts/base/interface/balancer/Gauge.sol +22 -0
  52. package/contracts/base/interface/balancer/IBVault.sol +580 -0
  53. package/contracts/base/interface/balancer/IBalancerMinter.sol +114 -0
  54. package/contracts/base/interface/balancer/IGyroPool.sol +7 -0
  55. package/contracts/base/interface/balancer/linearPool/ILinearPool.sol +184 -0
  56. package/contracts/base/interface/balancer/linearPool/ILinearPoolFactory.sol +16 -0
  57. package/contracts/base/interface/balancer/linearPool/ILinearPoolRebalancer.sol +8 -0
  58. package/contracts/base/interface/balancer/linearPool/IPoolSwapStructs.sol +56 -0
  59. package/contracts/base/interface/compound/CTokenInterface.sol +29 -0
  60. package/contracts/base/interface/compound/IComptroller.sol +9 -0
  61. package/contracts/base/interface/dolomite/IDepositWithdraw.sol +13 -0
  62. package/contracts/base/interface/dolomite/IDolomiteMargin.sol +15 -0
  63. package/contracts/base/interface/dolomite/IRewardsDistributor.sol +11 -0
  64. package/contracts/base/interface/gamma/IClearing.sol +7 -0
  65. package/contracts/base/interface/gamma/IHypervisor.sol +9 -0
  66. package/contracts/base/interface/gamma/IUniProxy.sol +14 -0
  67. package/contracts/base/interface/gmx/EventUtils.sol +253 -0
  68. package/contracts/base/interface/gmx/ICallbackReceiver.sol +119 -0
  69. package/contracts/base/interface/gmx/IDataStore.sol +7 -0
  70. package/contracts/base/interface/gmx/IExchangeRouter.sol +38 -0
  71. package/contracts/base/interface/gmx/IGMXViewer.sol +7 -0
  72. package/contracts/base/interface/gmx/IHandler.sol +12 -0
  73. package/contracts/base/interface/gmx/IMarket.sol +7 -0
  74. package/contracts/base/interface/gmx/IOracle.sol +6 -0
  75. package/contracts/base/interface/gmx/IPriceFeed.sol +12 -0
  76. package/contracts/base/interface/gmx/IReader.sol +49 -0
  77. package/contracts/base/interface/gmx/IRoleStore.sol +6 -0
  78. package/contracts/base/interface/ipor/Errors.sol +20 -0
  79. package/contracts/base/interface/ipor/FuseStorageLib.sol +71 -0
  80. package/contracts/base/interface/ipor/FusesLib.sol +149 -0
  81. package/contracts/base/interface/ipor/IFuseCommon.sol +9 -0
  82. package/contracts/base/interface/ipor/IFuseInstantWithdraw.sol +14 -0
  83. package/contracts/base/interface/ipor/IMarketBalanceFuse.sol +10 -0
  84. package/contracts/base/interface/ipor/IPriceOracleMiddleware.sol +42 -0
  85. package/contracts/base/interface/ipor/IporMath.sol +110 -0
  86. package/contracts/base/interface/ipor/PlasmaVaultConfigLib.sol +106 -0
  87. package/contracts/base/interface/ipor/PlasmaVaultLib.sol +293 -0
  88. package/contracts/base/interface/ipor/PlasmaVaultStorageLib.sol +352 -0
  89. package/contracts/base/interface/merkl/IDistributor.sol +6 -0
  90. package/contracts/base/interface/notional/INProxy.sol +44 -0
  91. package/contracts/base/interface/notional/IPrimeToken.sol +6 -0
  92. package/contracts/base/interface/venus/IRewardsDistributor.sol +6 -0
  93. package/contracts/base/interface/weth/IWETH.sol +39 -0
  94. package/contracts/base/ipor/Erc4626BalanceFuse.sol +54 -0
  95. package/contracts/base/ipor/Erc4626SupplyFuse.sol +134 -0
  96. package/contracts/base/noop/NoopStrategyUpgradeable.sol +90 -0
  97. package/contracts/base/upgradability/BaseUpgradeabilityProxy.sol +60 -0
  98. package/contracts/base/upgradability/BaseUpgradeableStrategy.sol +144 -0
  99. package/contracts/base/upgradability/BaseUpgradeableStrategyStorage.sol +284 -0
  100. package/contracts/base/upgradability/IUpgradable.sol +7 -0
  101. package/contracts/base/upgradability/ReentrancyGuardUpgradeable.sol +51 -0
  102. package/contracts/base/upgradability/StrategyProxy.sol +34 -0
  103. package/contracts/strategies/aura/AuraStrategy.sol +403 -0
  104. package/contracts/strategies/aura/AuraStrategyMainnet_MORE_GYD.sol +32 -0
  105. package/contracts/strategies/aura/AuraStrategyMainnet_sUSDe_GYD.sol +31 -0
  106. package/contracts/strategies/aura/AuraStrategyMainnet_waFRAX_sFRAX.sol +31 -0
  107. package/contracts/strategies/aura/AuraStrategyMainnet_waGHO_GYD.sol +31 -0
  108. package/contracts/strategies/aura/AuraStrategyMainnet_waUSDC_GHO.sol +32 -0
  109. package/contracts/strategies/aura/AuraStrategyMainnet_waUSDC_GYD.sol +31 -0
  110. package/contracts/strategies/aura/AuraStrategyMainnet_waUSDT_GYD.sol +31 -0
  111. package/contracts/strategies/aura/AuraStrategyMainnet_wstETH_GYD.sol +31 -0
  112. package/contracts/strategies/camelot/CamelotV3Strategy.sol +304 -0
  113. package/contracts/strategies/camelot/CamelotV3StrategyMainnet_ARB_USDC.sol +28 -0
  114. package/contracts/strategies/camelot/CamelotV3StrategyMainnet_ETH_USDC.sol +28 -0
  115. package/contracts/strategies/camelot/CamelotV3StrategyMainnet_ETH_USDT.sol +28 -0
  116. package/contracts/strategies/camelot/CamelotV3StrategyMainnet_GMX_ETH.sol +28 -0
  117. package/contracts/strategies/camelot/CamelotV3StrategyMainnet_GRAIL_ETH.sol +28 -0
  118. package/contracts/strategies/camelot/CamelotV3StrategyMainnet_USDC_USDT.sol +28 -0
  119. package/contracts/strategies/camelot/CamelotV3StrategyMainnet_WBTC_ETH.sol +28 -0
  120. package/contracts/strategies/dolomite/DolomiteLendStrategy.sol +273 -0
  121. package/contracts/strategies/dolomite/DolomiteLendStrategyMainnet_DAI.sol +26 -0
  122. package/contracts/strategies/dolomite/DolomiteLendStrategyMainnet_GMX.sol +26 -0
  123. package/contracts/strategies/dolomite/DolomiteLendStrategyMainnet_USDC.sol +26 -0
  124. package/contracts/strategies/dolomite/DolomiteLendStrategyMainnet_USDCe.sol +26 -0
  125. package/contracts/strategies/dolomite/DolomiteLendStrategyMainnet_USDT.sol +26 -0
  126. package/contracts/strategies/dolomite/DolomiteLendStrategyMainnet_WBTC.sol +26 -0
  127. package/contracts/strategies/dolomite/DolomiteLendStrategyMainnet_WETH.sol +26 -0
  128. package/contracts/strategies/fluid/FluidLendStrategy.sol +241 -0
  129. package/contracts/strategies/fluid/FluidLendStrategyMainnet_ETH.sol +25 -0
  130. package/contracts/strategies/fluid/FluidLendStrategyMainnet_USDC.sol +25 -0
  131. package/contracts/strategies/fluid/FluidLendStrategyMainnet_USDT.sol +25 -0
  132. package/contracts/strategies/gmx/GMXStrategy.sol +472 -0
  133. package/contracts/strategies/gmx/GMXStrategyMainnet_WBTC.sol +25 -0
  134. package/contracts/strategies/gmx/GMXViewer.sol +110 -0
  135. package/contracts/strategies/notional/NotionalStrategy.sol +223 -0
  136. package/contracts/strategies/notional/NotionalStrategyMainnet_nETH.sol +27 -0
  137. package/contracts/strategies/notional/NotionalStrategyMainnet_nUSDC.sol +27 -0
  138. package/contracts/strategies/notional/NotionalStrategyMainnet_nUSDT.sol +27 -0
  139. package/contracts/strategies/notional/NotionalStrategyMainnet_nwstETH.sol +27 -0
  140. package/contracts/strategies/venus/VenusFoldStrategy.sol +591 -0
  141. package/contracts/strategies/venus/VenusFoldStrategyMainnet_ARB.sol +32 -0
  142. package/contracts/strategies/venus/VenusFoldStrategyMainnet_ETH_core.sol +32 -0
  143. package/contracts/strategies/venus/VenusFoldStrategyMainnet_ETH_lsd.sol +32 -0
  144. package/contracts/strategies/venus/VenusFoldStrategyMainnet_USDC.sol +32 -0
  145. package/contracts/strategies/venus/VenusFoldStrategyMainnet_USDT.sol +32 -0
  146. package/contracts/strategies/venus/VenusFoldStrategyMainnet_WBTC.sol +32 -0
  147. package/hardhat.config.js +60 -0
  148. package/index.js +42 -0
  149. package/package.json +39 -6
  150. package/scripts/01-deploy-vault-regular-with-upgradable-strategy.js +41 -0
  151. package/scripts/02-deploy-vault-regular.js +35 -0
  152. package/scripts/03-deploy-upgradable-strategy.js +40 -0
  153. package/scripts/04-deploy-new-implementation.js +24 -0
  154. package/scripts/05-deploy-GMXViewer.js +17 -0
  155. package/scripts/06-deploy-GMXVault.js +49 -0
  156. package/scripts/07-deploy-ipor-fuses.js +29 -0
  157. package/scripts/08-deploy-drip.js +20 -0
  158. package/scripts/README.md +55 -0
  159. package/scripts/utils.js +22 -0
  160. package/test/aura/more-gyd.js +140 -0
  161. package/test/aura/susde-gyd.js +140 -0
  162. package/test/aura/wafrax-sfrax.js +140 -0
  163. package/test/aura/wagho-gyd.js +140 -0
  164. package/test/aura/wausdc-gho.js +141 -0
  165. package/test/aura/wausdc-gyd.js +140 -0
  166. package/test/aura/wausdt-gyd.js +140 -0
  167. package/test/aura/wsteth-gyd.js +138 -0
  168. package/test/camelot/arb-usdc.js +125 -0
  169. package/test/camelot/eth-usdc.js +125 -0
  170. package/test/camelot/eth-usdt.js +125 -0
  171. package/test/camelot/gmx-eth.js +125 -0
  172. package/test/camelot/grail-eth.js +125 -0
  173. package/test/camelot/usdc-usdt.js +125 -0
  174. package/test/camelot/wbtc-eth.js +125 -0
  175. package/test/dolomite/dai.js +127 -0
  176. package/test/dolomite/gmx.js +134 -0
  177. package/test/dolomite/usdc.js +127 -0
  178. package/test/dolomite/usdce.js +127 -0
  179. package/test/dolomite/usdt.js +127 -0
  180. package/test/dolomite/wbtc.js +127 -0
  181. package/test/dolomite/weth.js +127 -0
  182. package/test/fluid/eth.js +127 -0
  183. package/test/fluid/usdc.js +134 -0
  184. package/test/fluid/usdt.js +134 -0
  185. package/test/gmx/wbtc.js +184 -0
  186. package/test/notional/neth.js +133 -0
  187. package/test/notional/nusdc.js +133 -0
  188. package/test/notional/nusdt.js +133 -0
  189. package/test/notional/nwsteth.js +133 -0
  190. package/test/test-config.js +28 -0
  191. package/test/utilities/Utils.js +96 -0
  192. package/test/utilities/hh-utils.js +248 -0
  193. package/test/utilities/make-vault.js +16 -0
  194. package/test/venus/arb.js +135 -0
  195. package/test/venus/eth-core.js +133 -0
  196. package/test/venus/eth-lsd.js +133 -0
  197. package/test/venus/usdc.js +133 -0
  198. package/test/venus/usdt.js +133 -0
  199. package/test/venus/wbtc.js +133 -0
@@ -0,0 +1,141 @@
1
+
2
+ // Utilities
3
+ const Utils = require("../utilities/Utils.js");
4
+ const {
5
+ impersonates,
6
+ setupCoreProtocol,
7
+ depositVault,
8
+ } = require("../utilities/hh-utils.js");
9
+
10
+ const addresses = require("../test-config.js");
11
+ const { send } = require("@openzeppelin/test-helpers");
12
+ const BigNumber = require("bignumber.js");
13
+ const IERC20 = artifacts.require("IERC20");
14
+
15
+ //const Strategy = artifacts.require("");
16
+ const Strategy = artifacts.require("AuraStrategyMainnet_waUSDC_GHO");
17
+
18
+ // Developed and tested at blockNumber 266391470
19
+
20
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
21
+ describe("Arbitrum Mainnet Aura Gyro waUSDC-GHO", function() {
22
+ let accounts;
23
+
24
+ // external contracts
25
+ let underlying;
26
+
27
+ // external setup
28
+ let underlyingWhale = "0x027917095a4d4964eFF7280676F405126BF9A6b5";
29
+ let weth = "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
30
+ let usdc = "0xaf88d065e77c8cC2239327C5EDb3A432268e5831";
31
+ let gho = "0x7dfF72693f6A4149b17e7C6314655f6A9F7c8B33";
32
+ let wausdc = "0x7CFaDFD5645B50bE87d546f42699d863648251ad";
33
+
34
+ // parties in the protocol
35
+ let governance;
36
+ let farmer1;
37
+
38
+ // numbers used in tests
39
+ let farmerBalance;
40
+
41
+ // Core protocol contracts
42
+ let controller;
43
+ let vault;
44
+ let strategy;
45
+
46
+ async function setupExternalContracts() {
47
+ underlying = await IERC20.at("0x46472CBA35E6800012aA9fcC7939Ff07478C473E");
48
+ console.log("Fetching Underlying at: ", underlying.address);
49
+ }
50
+
51
+ async function setupBalance(){
52
+ let etherGiver = accounts[9];
53
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 10e18});
54
+ await web3.eth.sendTransaction({ from: etherGiver, to: addresses.ULOwner, 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
+ await web3.eth.sendTransaction({ from: etherGiver, to: addresses.ULOwner, value: 10e18});
72
+
73
+ await setupExternalContracts();
74
+ [controller, vault, strategy] = await setupCoreProtocol({
75
+ "existingVaultAddress": null,
76
+ "strategyArtifact": Strategy,
77
+ "strategyArtifactIsUpgradable": true,
78
+ "underlying": underlying,
79
+ "governance": governance,
80
+ "ULOwner": addresses.ULOwner,
81
+ "liquidation": [
82
+ // {"camelotV3": [weth, usdc]},
83
+ // {"balancer": [usdc, gho]},
84
+ {"balancer": [gho, wausdc]},
85
+ ],
86
+ "balancerPool": [
87
+ // [weth, wsteth, "0x7967fa58b9501600d96bd843173b9334983ee6e600020000000000000000056e"],
88
+ // [usdc, gho, "0xf890360473c12d8015da8dbf7af11da87337a065000000000000000000000570"],
89
+ [gho, wausdc, "0x46472cba35e6800012aa9fcc7939ff07478c473e00020000000000000000056c"],
90
+ ]
91
+ });
92
+
93
+ // whale send underlying to farmers
94
+ await setupBalance();
95
+ });
96
+
97
+ describe("Happy path", function() {
98
+ it("Farmer should earn money", async function() {
99
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
100
+ await depositVault(farmer1, underlying, vault, farmerBalance);
101
+
102
+ let hours = 10;
103
+ let blocksPerHour = 800;
104
+ let oldSharePrice;
105
+ let newSharePrice;
106
+
107
+ for (let i = 0; i < hours; i++) {
108
+ console.log("loop ", i);
109
+
110
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
111
+ await controller.doHardWork(vault.address, { from: governance });
112
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
113
+
114
+ console.log("old shareprice: ", oldSharePrice.toFixed());
115
+ console.log("new shareprice: ", newSharePrice.toFixed());
116
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
117
+
118
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))*365;
119
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))+1)**365;
120
+
121
+ console.log("instant APR:", apr*100, "%");
122
+ console.log("instant APY:", (apy-1)*100, "%");
123
+
124
+ await Utils.advanceNBlock(blocksPerHour);
125
+ }
126
+ await vault.withdraw(new BigNumber(await vault.balanceOf(farmer1)).toFixed(), { from: farmer1 });
127
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
128
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
129
+
130
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))*365;
131
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))+1)**365;
132
+
133
+ console.log("earned!");
134
+ console.log("APR:", apr*100, "%");
135
+ console.log("APY:", (apy-1)*100, "%");
136
+
137
+ await strategy.withdrawAllToVault({from:governance}); // making sure can withdraw all for a next switch
138
+
139
+ });
140
+ });
141
+ });
@@ -0,0 +1,140 @@
1
+
2
+ // Utilities
3
+ const Utils = require("../utilities/Utils.js");
4
+ const {
5
+ impersonates,
6
+ setupCoreProtocol,
7
+ depositVault,
8
+ } = require("../utilities/hh-utils.js");
9
+
10
+ const addresses = require("../test-config.js");
11
+ const { send } = require("@openzeppelin/test-helpers");
12
+ const BigNumber = require("bignumber.js");
13
+ const IERC20 = artifacts.require("IERC20");
14
+
15
+ //const Strategy = artifacts.require("");
16
+ const Strategy = artifacts.require("AuraStrategyMainnet_waUSDC_GYD");
17
+
18
+ // Developed and tested at blockNumber 266401100
19
+
20
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
21
+ describe("Arbitrum Mainnet Aura Gyro waUSDC-GYD", function() {
22
+ let accounts;
23
+
24
+ // external contracts
25
+ let underlying;
26
+
27
+ // external setup
28
+ let underlyingWhale = "0xeBfC0d4a6E1B8adF166a4a20c526BC2A76948f6c";
29
+ let weth = "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
30
+ let wsteth = "0x5979d7b546e38e414f7e9822514be443a4800529";
31
+ let gyd = "0xCA5d8F8a8d49439357d3CF46Ca2e720702F132b8";
32
+ let wausdc = "0x7CFaDFD5645B50bE87d546f42699d863648251ad";
33
+
34
+ // parties in the protocol
35
+ let governance;
36
+ let farmer1;
37
+
38
+ // numbers used in tests
39
+ let farmerBalance;
40
+
41
+ // Core protocol contracts
42
+ let controller;
43
+ let vault;
44
+ let strategy;
45
+
46
+ async function setupExternalContracts() {
47
+ underlying = await IERC20.at("0x6e822c64c00393b2078f2a5BB75c575aB505B55c");
48
+ console.log("Fetching Underlying at: ", underlying.address);
49
+ }
50
+
51
+ async function setupBalance(){
52
+ let etherGiver = accounts[9];
53
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 10e18});
54
+ await web3.eth.sendTransaction({ from: etherGiver, to: addresses.ULOwner, 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
+ await web3.eth.sendTransaction({ from: etherGiver, to: addresses.ULOwner, value: 10e18});
72
+
73
+ await setupExternalContracts();
74
+ [controller, vault, strategy] = await setupCoreProtocol({
75
+ "existingVaultAddress": null,
76
+ "strategyArtifact": Strategy,
77
+ "strategyArtifactIsUpgradable": true,
78
+ "underlying": underlying,
79
+ "governance": governance,
80
+ "ULOwner": addresses.ULOwner,
81
+ "liquidation": [
82
+ {"balancer": [weth, wsteth, gyd]},
83
+ {"balancer": [gyd, wausdc]},
84
+ ],
85
+ "balancerPool": [
86
+ [weth, wsteth, "0x7967fa58b9501600d96bd843173b9334983ee6e600020000000000000000056e"],
87
+ [wsteth, gyd, "0x6ce1d1e46548ef657f8d7ebddfc4beadb04f72f30002000000000000000005a1"],
88
+ [gyd, wausdc, "0x6e822c64c00393b2078f2a5bb75c575ab505b55c000200000000000000000548"],
89
+ ]
90
+ });
91
+
92
+ // whale send underlying to farmers
93
+ await setupBalance();
94
+ });
95
+
96
+ describe("Happy path", function() {
97
+ it("Farmer should earn money", async function() {
98
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
99
+ await depositVault(farmer1, underlying, vault, farmerBalance);
100
+
101
+ let hours = 10;
102
+ let blocksPerHour = 800;
103
+ let oldSharePrice;
104
+ let newSharePrice;
105
+
106
+ for (let i = 0; i < hours; i++) {
107
+ console.log("loop ", i);
108
+
109
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
110
+ await controller.doHardWork(vault.address, { from: governance });
111
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
112
+
113
+ console.log("old shareprice: ", oldSharePrice.toFixed());
114
+ console.log("new shareprice: ", newSharePrice.toFixed());
115
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
116
+
117
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))*365;
118
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))+1)**365;
119
+
120
+ console.log("instant APR:", apr*100, "%");
121
+ console.log("instant APY:", (apy-1)*100, "%");
122
+
123
+ await Utils.advanceNBlock(blocksPerHour);
124
+ }
125
+ await vault.withdraw(new BigNumber(await vault.balanceOf(farmer1)).toFixed(), { from: farmer1 });
126
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
127
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
128
+
129
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))*365;
130
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))+1)**365;
131
+
132
+ console.log("earned!");
133
+ console.log("APR:", apr*100, "%");
134
+ console.log("APY:", (apy-1)*100, "%");
135
+
136
+ await strategy.withdrawAllToVault({from:governance}); // making sure can withdraw all for a next switch
137
+
138
+ });
139
+ });
140
+ });
@@ -0,0 +1,140 @@
1
+
2
+ // Utilities
3
+ const Utils = require("../utilities/Utils.js");
4
+ const {
5
+ impersonates,
6
+ setupCoreProtocol,
7
+ depositVault,
8
+ } = require("../utilities/hh-utils.js");
9
+
10
+ const addresses = require("../test-config.js");
11
+ const { send } = require("@openzeppelin/test-helpers");
12
+ const BigNumber = require("bignumber.js");
13
+ const IERC20 = artifacts.require("IERC20");
14
+
15
+ //const Strategy = artifacts.require("");
16
+ const Strategy = artifacts.require("AuraStrategyMainnet_waUSDT_GYD");
17
+
18
+ // Developed and tested at blockNumber 266391470
19
+
20
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
21
+ describe("Arbitrum Mainnet Aura Gyro waUSDT-GYD", function() {
22
+ let accounts;
23
+
24
+ // external contracts
25
+ let underlying;
26
+
27
+ // external setup
28
+ let underlyingWhale = "0x89Cd4C4be4e5bFf559517e25aC05D6C9AD01d89c";
29
+ let weth = "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
30
+ let wsteth = "0x5979d7b546e38e414f7e9822514be443a4800529";
31
+ let gyd = "0xCA5d8F8a8d49439357d3CF46Ca2e720702F132b8";
32
+ let wausdt = "0xb165a74407fE1e519d6bCbDeC1Ed3202B35a4140";
33
+
34
+ // parties in the protocol
35
+ let governance;
36
+ let farmer1;
37
+
38
+ // numbers used in tests
39
+ let farmerBalance;
40
+
41
+ // Core protocol contracts
42
+ let controller;
43
+ let vault;
44
+ let strategy;
45
+
46
+ async function setupExternalContracts() {
47
+ underlying = await IERC20.at("0x7272163A931DaC5BBe1CB5feFaF959BB65F7346F");
48
+ console.log("Fetching Underlying at: ", underlying.address);
49
+ }
50
+
51
+ async function setupBalance(){
52
+ let etherGiver = accounts[9];
53
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 10e18});
54
+ await web3.eth.sendTransaction({ from: etherGiver, to: addresses.ULOwner, 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
+ await web3.eth.sendTransaction({ from: etherGiver, to: addresses.ULOwner, value: 10e18});
72
+
73
+ await setupExternalContracts();
74
+ [controller, vault, strategy] = await setupCoreProtocol({
75
+ "existingVaultAddress": null,
76
+ "strategyArtifact": Strategy,
77
+ "strategyArtifactIsUpgradable": true,
78
+ "underlying": underlying,
79
+ "governance": governance,
80
+ "ULOwner": addresses.ULOwner,
81
+ "liquidation": [
82
+ {"balancer": [weth, wsteth, gyd]},
83
+ {"balancer": [gyd, wausdt]},
84
+ ],
85
+ "balancerPool": [
86
+ [weth, wsteth, "0x7967fa58b9501600d96bd843173b9334983ee6e600020000000000000000056e"],
87
+ [wsteth, gyd, "0x6ce1d1e46548ef657f8d7ebddfc4beadb04f72f30002000000000000000005a1"],
88
+ [gyd, wausdt, "0x7272163a931dac5bbe1cb5fefaf959bb65f7346f000200000000000000000549"],
89
+ ]
90
+ });
91
+
92
+ // whale send underlying to farmers
93
+ await setupBalance();
94
+ });
95
+
96
+ describe("Happy path", function() {
97
+ it("Farmer should earn money", async function() {
98
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
99
+ await depositVault(farmer1, underlying, vault, farmerBalance);
100
+
101
+ let hours = 10;
102
+ let blocksPerHour = 800;
103
+ let oldSharePrice;
104
+ let newSharePrice;
105
+
106
+ for (let i = 0; i < hours; i++) {
107
+ console.log("loop ", i);
108
+
109
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
110
+ await controller.doHardWork(vault.address, { from: governance });
111
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
112
+
113
+ console.log("old shareprice: ", oldSharePrice.toFixed());
114
+ console.log("new shareprice: ", newSharePrice.toFixed());
115
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
116
+
117
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))*365;
118
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))+1)**365;
119
+
120
+ console.log("instant APR:", apr*100, "%");
121
+ console.log("instant APY:", (apy-1)*100, "%");
122
+
123
+ await Utils.advanceNBlock(blocksPerHour);
124
+ }
125
+ await vault.withdraw(new BigNumber(await vault.balanceOf(farmer1)).toFixed(), { from: farmer1 });
126
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
127
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
128
+
129
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))*365;
130
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))+1)**365;
131
+
132
+ console.log("earned!");
133
+ console.log("APR:", apr*100, "%");
134
+ console.log("APY:", (apy-1)*100, "%");
135
+
136
+ await strategy.withdrawAllToVault({from:governance}); // making sure can withdraw all for a next switch
137
+
138
+ });
139
+ });
140
+ });
@@ -0,0 +1,138 @@
1
+
2
+ // Utilities
3
+ const Utils = require("../utilities/Utils.js");
4
+ const {
5
+ impersonates,
6
+ setupCoreProtocol,
7
+ depositVault,
8
+ } = require("../utilities/hh-utils.js");
9
+
10
+ const addresses = require("../test-config.js");
11
+ const { send } = require("@openzeppelin/test-helpers");
12
+ const BigNumber = require("bignumber.js");
13
+ const IERC20 = artifacts.require("IERC20");
14
+
15
+ //const Strategy = artifacts.require("");
16
+ const Strategy = artifacts.require("AuraStrategyMainnet_wstETH_GYD");
17
+
18
+ // Developed and tested at blockNumber 266447050
19
+
20
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
21
+ describe("Arbitrum Mainnet Aura Gyro wstETH-GYD", function() {
22
+ let accounts;
23
+
24
+ // external contracts
25
+ let underlying;
26
+
27
+ // external setup
28
+ let underlyingWhale = "0x194C65acF3698088A3987375513Dd3eC152B4a07";
29
+ let weth = "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1";
30
+ let wsteth = "0x5979D7b546E38E414F7E9822514be443A4800529";
31
+ let gyd = "0xCA5d8F8a8d49439357d3CF46Ca2e720702F132b8";
32
+
33
+ // parties in the protocol
34
+ let governance;
35
+ let farmer1;
36
+
37
+ // numbers used in tests
38
+ let farmerBalance;
39
+
40
+ // Core protocol contracts
41
+ let controller;
42
+ let vault;
43
+ let strategy;
44
+
45
+ async function setupExternalContracts() {
46
+ underlying = await IERC20.at("0x6ce1D1e46548ef657f8D7Ebddfc4BEaDB04F72f3");
47
+ console.log("Fetching Underlying at: ", underlying.address);
48
+ }
49
+
50
+ async function setupBalance(){
51
+ let etherGiver = accounts[9];
52
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 10e18});
53
+ await web3.eth.sendTransaction({ from: etherGiver, to: addresses.ULOwner, value: 10e18});
54
+
55
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
56
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
57
+ }
58
+
59
+ before(async function() {
60
+ governance = addresses.Governance;
61
+ accounts = await web3.eth.getAccounts();
62
+
63
+ farmer1 = accounts[1];
64
+
65
+ // impersonate accounts
66
+ await impersonates([governance, underlyingWhale, addresses.ULOwner]);
67
+
68
+ let etherGiver = accounts[9];
69
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 10e18});
70
+ await web3.eth.sendTransaction({ from: etherGiver, to: addresses.ULOwner, value: 10e18});
71
+
72
+ await setupExternalContracts();
73
+ [controller, vault, strategy] = await setupCoreProtocol({
74
+ "existingVaultAddress": null,
75
+ "strategyArtifact": Strategy,
76
+ "strategyArtifactIsUpgradable": true,
77
+ "underlying": underlying,
78
+ "governance": governance,
79
+ "ULOwner": addresses.ULOwner,
80
+ "liquidation": [
81
+ {"balancer": [wsteth, gyd]},
82
+ {"balancer": [weth, wsteth]},
83
+ ],
84
+ "balancerPool": [
85
+ [weth, wsteth, "0x7967fa58b9501600d96bd843173b9334983ee6e600020000000000000000056e"],
86
+ [wsteth, gyd, "0x6ce1d1e46548ef657f8d7ebddfc4beadb04f72f30002000000000000000005a1"],
87
+ ]
88
+ });
89
+
90
+ // whale send underlying to farmers
91
+ await setupBalance();
92
+ });
93
+
94
+ describe("Happy path", function() {
95
+ it("Farmer should earn money", async function() {
96
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
97
+ await depositVault(farmer1, underlying, vault, farmerBalance);
98
+
99
+ let hours = 10;
100
+ let blocksPerHour = 800;
101
+ let oldSharePrice;
102
+ let newSharePrice;
103
+
104
+ for (let i = 0; i < hours; i++) {
105
+ console.log("loop ", i);
106
+
107
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
108
+ await controller.doHardWork(vault.address, { from: governance });
109
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
110
+
111
+ console.log("old shareprice: ", oldSharePrice.toFixed());
112
+ console.log("new shareprice: ", newSharePrice.toFixed());
113
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
114
+
115
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))*365;
116
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))+1)**365;
117
+
118
+ console.log("instant APR:", apr*100, "%");
119
+ console.log("instant APY:", (apy-1)*100, "%");
120
+
121
+ await Utils.advanceNBlock(blocksPerHour);
122
+ }
123
+ await vault.withdraw(new BigNumber(await vault.balanceOf(farmer1)).toFixed(), { from: farmer1 });
124
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
125
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
126
+
127
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))*365;
128
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))+1)**365;
129
+
130
+ console.log("earned!");
131
+ console.log("APR:", apr*100, "%");
132
+ console.log("APY:", (apy-1)*100, "%");
133
+
134
+ await strategy.withdrawAllToVault({from:governance}); // making sure can withdraw all for a next switch
135
+
136
+ });
137
+ });
138
+ });
@@ -0,0 +1,125 @@
1
+
2
+ // Utilities
3
+ const Utils = require("../utilities/Utils.js");
4
+ const {
5
+ impersonates,
6
+ setupCoreProtocol,
7
+ depositVault,
8
+ } = require("../utilities/hh-utils.js");
9
+
10
+ const addresses = require("../test-config.js");
11
+ const { send } = require("@openzeppelin/test-helpers");
12
+ const BigNumber = require("bignumber.js");
13
+ const IERC20 = artifacts.require("IERC20");
14
+
15
+ //const Strategy = artifacts.require("");
16
+ const Strategy = artifacts.require("CamelotV3StrategyMainnet_ARB_USDC");
17
+
18
+ // Developed and tested at blockNumber 286690500
19
+
20
+ // Vanilla Mocha test. Increased compatibility with tools that integrate Mocha.
21
+ describe("Arbitrum Mainnet Camelot V3 ARB-USDC", function() {
22
+ let accounts;
23
+
24
+ // external contracts
25
+ let underlying;
26
+
27
+ // external setup
28
+ let underlyingWhale = "0x3E893426E65Cf198D4DF266B77CfA46559c815eE";
29
+
30
+ // parties in the protocol
31
+ let governance;
32
+ let farmer1;
33
+
34
+ // numbers used in tests
35
+ let farmerBalance;
36
+
37
+ // Core protocol contracts
38
+ let controller;
39
+ let vault;
40
+ let strategy;
41
+
42
+ async function setupExternalContracts() {
43
+ underlying = await IERC20.at("0x29237292F15BC3615BFCc0D958C265Aa64527FB2");
44
+ console.log("Fetching Underlying at: ", underlying.address);
45
+ }
46
+
47
+ async function setupBalance(){
48
+ let etherGiver = accounts[9];
49
+ await web3.eth.sendTransaction({ from: etherGiver, to: underlyingWhale, value: 10e18});
50
+
51
+ farmerBalance = await underlying.balanceOf(underlyingWhale);
52
+ await underlying.transfer(farmer1, farmerBalance, { from: underlyingWhale });
53
+ }
54
+
55
+ before(async function() {
56
+ governance = addresses.Governance;
57
+ accounts = await web3.eth.getAccounts();
58
+
59
+ farmer1 = accounts[1];
60
+
61
+ // impersonate accounts
62
+ await impersonates([governance, underlyingWhale, addresses.ULOwner]);
63
+
64
+ let etherGiver = accounts[9];
65
+ await web3.eth.sendTransaction({ from: etherGiver, to: governance, value: 10e18});
66
+
67
+ await setupExternalContracts();
68
+ [controller, vault, strategy] = await setupCoreProtocol({
69
+ "existingVaultAddress": "0xc2eEE8782B74289774Fe08DA85292fFD22198925",
70
+ "announceStrategy": true,
71
+ "strategyArtifact": Strategy,
72
+ "strategyArtifactIsUpgradable": true,
73
+ "underlying": underlying,
74
+ "governance": governance,
75
+ });
76
+
77
+ // whale send underlying to farmers
78
+ await setupBalance();
79
+ });
80
+
81
+ describe("Happy path", function() {
82
+ it("Farmer should earn money", async function() {
83
+ let farmerOldBalance = new BigNumber(await underlying.balanceOf(farmer1));
84
+ await depositVault(farmer1, underlying, vault, farmerBalance);
85
+
86
+ let hours = 10;
87
+ let blocksPerHour = 3600;
88
+ let oldSharePrice;
89
+ let newSharePrice;
90
+
91
+ for (let i = 0; i < hours; i++) {
92
+ console.log("loop ", i);
93
+
94
+ oldSharePrice = new BigNumber(await vault.getPricePerFullShare());
95
+ await controller.doHardWork(vault.address, { from: governance });
96
+ newSharePrice = new BigNumber(await vault.getPricePerFullShare());
97
+
98
+ console.log("old shareprice: ", oldSharePrice.toFixed());
99
+ console.log("new shareprice: ", newSharePrice.toFixed());
100
+ console.log("growth: ", newSharePrice.toFixed() / oldSharePrice.toFixed());
101
+
102
+ apr = (newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))*365;
103
+ apy = ((newSharePrice.toFixed()/oldSharePrice.toFixed()-1)*(24/(blocksPerHour/300))+1)**365;
104
+
105
+ console.log("instant APR:", apr*100, "%");
106
+ console.log("instant APY:", (apy-1)*100, "%");
107
+
108
+ await Utils.advanceNBlock(blocksPerHour);
109
+ }
110
+ await vault.withdraw(new BigNumber(await vault.balanceOf(farmer1)).toFixed(), { from: farmer1 });
111
+ let farmerNewBalance = new BigNumber(await underlying.balanceOf(farmer1));
112
+ Utils.assertBNGt(farmerNewBalance, farmerOldBalance);
113
+
114
+ apr = (farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))*365;
115
+ apy = ((farmerNewBalance.toFixed()/farmerOldBalance.toFixed()-1)*(24/(blocksPerHour*hours/300))+1)**365;
116
+
117
+ console.log("earned!");
118
+ console.log("APR:", apr*100, "%");
119
+ console.log("APY:", (apy-1)*100, "%");
120
+
121
+ await strategy.withdrawAllToVault({from:governance}); // making sure can withdraw all for a next switch
122
+
123
+ });
124
+ });
125
+ });