@gooddollar/goodprotocol 1.0.10 → 1.0.13-beta.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.
Files changed (127) hide show
  1. package/artifacts/contracts/DAOStackInterfaces.sol/Avatar.dbg.json +1 -1
  2. package/artifacts/contracts/DAOStackInterfaces.sol/Controller.dbg.json +1 -1
  3. package/artifacts/contracts/DAOStackInterfaces.sol/GlobalConstraintInterface.dbg.json +1 -1
  4. package/artifacts/contracts/DAOStackInterfaces.sol/IntVoteInterface.dbg.json +1 -1
  5. package/artifacts/contracts/DAOStackInterfaces.sol/ReputationInterface.dbg.json +1 -1
  6. package/artifacts/contracts/DAOStackInterfaces.sol/SchemeRegistrar.dbg.json +1 -1
  7. package/artifacts/contracts/Interfaces.sol/AggregatorV3Interface.dbg.json +1 -1
  8. package/artifacts/contracts/Interfaces.sol/ERC20.dbg.json +1 -1
  9. package/artifacts/contracts/Interfaces.sol/IAaveIncentivesController.dbg.json +1 -1
  10. package/artifacts/contracts/Interfaces.sol/IAdminWallet.dbg.json +1 -1
  11. package/artifacts/contracts/Interfaces.sol/IDonationStaking.dbg.json +1 -1
  12. package/artifacts/contracts/Interfaces.sol/IERC2917.dbg.json +1 -1
  13. package/artifacts/contracts/Interfaces.sol/IFirstClaimPool.dbg.json +1 -1
  14. package/artifacts/contracts/Interfaces.sol/IGoodDollar.dbg.json +1 -1
  15. package/artifacts/contracts/Interfaces.sol/IGoodStaking.dbg.json +1 -1
  16. package/artifacts/contracts/Interfaces.sol/IHasRouter.dbg.json +1 -1
  17. package/artifacts/contracts/Interfaces.sol/IIdentity.dbg.json +1 -1
  18. package/artifacts/contracts/Interfaces.sol/ILendingPool.dbg.json +1 -1
  19. package/artifacts/contracts/Interfaces.sol/INameService.dbg.json +1 -1
  20. package/artifacts/contracts/Interfaces.sol/IUBIScheme.dbg.json +1 -1
  21. package/artifacts/contracts/Interfaces.sol/ProxyAdmin.dbg.json +1 -1
  22. package/artifacts/contracts/Interfaces.sol/Reserve.dbg.json +1 -1
  23. package/artifacts/contracts/Interfaces.sol/Staking.dbg.json +1 -1
  24. package/artifacts/contracts/Interfaces.sol/Uniswap.dbg.json +1 -1
  25. package/artifacts/contracts/Interfaces.sol/UniswapFactory.dbg.json +1 -1
  26. package/artifacts/contracts/Interfaces.sol/UniswapPair.dbg.json +1 -1
  27. package/artifacts/contracts/Interfaces.sol/cERC20.dbg.json +1 -1
  28. package/artifacts/contracts/governance/ClaimersDistribution.sol/ClaimersDistribution.dbg.json +1 -1
  29. package/artifacts/contracts/governance/CompoundVotingMachine.sol/CompoundVotingMachine.dbg.json +1 -1
  30. package/artifacts/contracts/governance/GReputation.sol/GReputation.dbg.json +1 -1
  31. package/artifacts/contracts/governance/GovarnanceStaking.sol/GovernanceStaking.dbg.json +1 -1
  32. package/artifacts/contracts/governance/MultiBaseGovernanceShareField.sol/MultiBaseGovernanceShareField.dbg.json +1 -1
  33. package/artifacts/contracts/governance/Reputation.sol/Reputation.dbg.json +1 -1
  34. package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.dbg.json +1 -1
  35. package/artifacts/contracts/governance/StakersDistribution.sol/StakersDistribution.json +2 -2
  36. package/artifacts/contracts/mocks/AaveMock.sol/AaveMock.dbg.json +1 -1
  37. package/artifacts/contracts/mocks/DAIMock.sol/DAIMock.dbg.json +1 -1
  38. package/artifacts/contracts/mocks/DecimalsMock.sol/DecimalsMock.dbg.json +1 -1
  39. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.dbg.json +1 -1
  40. package/artifacts/contracts/mocks/GoodCompoundStakingTest.sol/GoodCompoundStakingTest.json +6 -6
  41. package/artifacts/contracts/mocks/GoodFundManagerTest.sol/GoodFundManagerTest.dbg.json +1 -1
  42. package/artifacts/contracts/mocks/IncentiveControllerMock.sol/IncentiveControllerMock.dbg.json +1 -1
  43. package/artifacts/contracts/mocks/LendingPoolMock.sol/LendingPoolMock.dbg.json +1 -1
  44. package/artifacts/contracts/mocks/OverMintTester.sol/OverMintTester.dbg.json +1 -1
  45. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.dbg.json +1 -1
  46. package/artifacts/contracts/mocks/OverMintTesterRegularStake.sol/OverMintTesterRegularStake.json +2 -2
  47. package/artifacts/contracts/mocks/SixteenDecimalsTokenMock.sol/SixteenDecimalsTokenMock.dbg.json +1 -1
  48. package/artifacts/contracts/mocks/SwapHelperTest.sol/SwapHelperTest.dbg.json +1 -1
  49. package/artifacts/contracts/mocks/TwentyDecimalsTokenMock.sol/TwentyDecimalsTokenMock.dbg.json +1 -1
  50. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock.dbg.json +1 -1
  51. package/artifacts/contracts/mocks/UpgradableMocks.sol/UpgradableMock2.dbg.json +1 -1
  52. package/artifacts/contracts/mocks/UsdcMock.sol/USDCMock.dbg.json +1 -1
  53. package/artifacts/contracts/mocks/cBATMock.sol/cBATMock.dbg.json +1 -1
  54. package/artifacts/contracts/mocks/cDAILowWorthMock.sol/cDAILowWorthMock.dbg.json +1 -1
  55. package/artifacts/contracts/mocks/cDAIMock.sol/cDAIMock.dbg.json +1 -1
  56. package/artifacts/contracts/mocks/cDAINonMintableMock.sol/cDAINonMintableMock.dbg.json +1 -1
  57. package/artifacts/contracts/mocks/cDecimalsMock.sol/cDecimalsMock.dbg.json +1 -1
  58. package/artifacts/contracts/mocks/cSDTMock.sol/cSDTMock.dbg.json +1 -1
  59. package/artifacts/contracts/mocks/cUSDCMock.sol/cUSDCMock.dbg.json +1 -1
  60. package/artifacts/contracts/reserve/ExchangeHelper.sol/ExchangeHelper.dbg.json +1 -1
  61. package/artifacts/contracts/reserve/GoodMarketMaker.sol/GoodMarketMaker.dbg.json +1 -1
  62. package/artifacts/contracts/reserve/GoodReserveCDai.sol/ContributionCalc.dbg.json +1 -1
  63. package/artifacts/contracts/reserve/GoodReserveCDai.sol/GoodReserveCDai.dbg.json +1 -1
  64. package/artifacts/contracts/staking/BaseShareField.sol/BaseShareField.dbg.json +1 -1
  65. package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.dbg.json +1 -1
  66. package/artifacts/contracts/staking/BaseShareFieldV2.sol/BaseShareFieldV2.json +48 -104
  67. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.dbg.json +1 -1
  68. package/artifacts/contracts/staking/DonationsStaking.sol/DonationsStaking.json +2 -2
  69. package/artifacts/contracts/staking/GoodFundManager.sol/GoodFundManager.dbg.json +1 -1
  70. package/artifacts/contracts/staking/SimpleStaking.sol/SimpleStaking.dbg.json +1 -1
  71. package/artifacts/contracts/staking/SimpleStakingV2.sol/SimpleStakingV2.dbg.json +1 -1
  72. package/artifacts/contracts/staking/SimpleStakingV2.sol/SimpleStakingV2.json +48 -123
  73. package/artifacts/contracts/staking/UniswapV2SwapHelper.sol/UniswapV2SwapHelper.dbg.json +1 -1
  74. package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.dbg.json +1 -1
  75. package/artifacts/contracts/staking/aave/AaveStakingFactory.sol/AaveStakingFactory.json +65 -12
  76. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.dbg.json +1 -1
  77. package/artifacts/contracts/staking/aave/GoodAaveStaking.sol/GoodAaveStaking.json +4 -4
  78. package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.dbg.json +1 -1
  79. package/artifacts/contracts/staking/aave/GoodAaveStakingV2.sol/GoodAaveStakingV2.json +52 -127
  80. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.dbg.json +1 -1
  81. package/artifacts/contracts/staking/compound/CompoundStakingFactory.sol/CompoundStakingFactory.json +57 -14
  82. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.dbg.json +1 -1
  83. package/artifacts/contracts/staking/compound/GoodCompoundStaking.sol/GoodCompoundStaking.json +6 -6
  84. package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.dbg.json +4 -0
  85. package/artifacts/contracts/staking/compound/GoodCompoundStakingV2.sol/GoodCompoundStakingV2.json +1092 -0
  86. package/artifacts/contracts/ubi/UBIScheme.sol/UBIScheme.dbg.json +1 -1
  87. package/artifacts/contracts/unaudited-foundation/FuseFaucet.sol/FuseFaucet.dbg.json +1 -1
  88. package/artifacts/contracts/unaudited-foundation/InvitesV1.sol/InvitesV1.dbg.json +1 -1
  89. package/artifacts/contracts/utils/BancorFormula.sol/BancorFormula.dbg.json +1 -1
  90. package/artifacts/contracts/utils/DAOContract.sol/DAOContract.dbg.json +1 -1
  91. package/artifacts/contracts/utils/DAOUpgradeableContract.sol/DAOUpgradeableContract.dbg.json +1 -1
  92. package/artifacts/contracts/utils/DSMath.sol/DSMath.dbg.json +1 -1
  93. package/artifacts/contracts/utils/DataTypes.sol/DataTypes.dbg.json +1 -1
  94. package/artifacts/contracts/utils/NameService.sol/NameService.dbg.json +1 -1
  95. package/artifacts/contracts/utils/ProtocolUpgrade.sol/OldMarketMaker.dbg.json +1 -1
  96. package/artifacts/contracts/utils/ProtocolUpgrade.sol/ProtocolUpgrade.dbg.json +1 -1
  97. package/artifacts/contracts/utils/ProtocolUpgradeFuse.sol/ProtocolUpgradeFuse.dbg.json +1 -1
  98. package/artifacts/contracts/utils/ReputationTestHelper.sol/ReputationTestHelper.dbg.json +1 -1
  99. package/contracts/staking/BaseShareFieldV2.sol +45 -21
  100. package/contracts/staking/SimpleStaking.sol +0 -7
  101. package/contracts/staking/SimpleStakingV2.sol +10 -44
  102. package/contracts/staking/aave/AaveStakingFactory.sol +45 -19
  103. package/contracts/staking/aave/GoodAaveStaking.sol +1 -1
  104. package/contracts/staking/aave/GoodAaveStakingV2.sol +2 -2
  105. package/contracts/staking/compound/CompoundStakingFactory.sol +41 -18
  106. package/contracts/staking/compound/GoodCompoundStaking.sol +1 -1
  107. package/contracts/staking/compound/GoodCompoundStakingV2.sol +315 -0
  108. package/package.json +1 -1
  109. package/releases/deployment.json +57 -47
  110. package/scripts/upgradeToV2/upgradeToV2.ts +7 -3
  111. package/test/governance/StakersDistribution.test.ts +30 -1
  112. package/test/helpers.ts +1 -0
  113. package/test/staking/CompoundStakingFactory.test.ts +24 -21
  114. package/test/staking/DifferentStakingTokens.test.ts +3 -1
  115. package/test/staking/DonationsStaking.test.ts +21 -16
  116. package/test/staking/GoodAaveStakingFactory.test.ts +26 -23
  117. package/test/staking/SimpleDAIStaking.test.ts +3 -11
  118. package/test/staking/StakingRewards.test.ts +20 -14
  119. package/test/staking/SwapHelper.test.ts +4 -1
  120. package/test/staking/UsdcAaveStaking.test.ts +23 -8
  121. package/test/ubi/UBIScheme.e2e.test.ts +1 -1
  122. package/test/utils/ProtocolUpgrade.test.ts +1 -1
  123. package/artifacts/contracts/staking/aave/AaveStakingFactoryV2.sol/AaveStakingFactoryV2.dbg.json +0 -4
  124. package/artifacts/contracts/staking/aave/AaveStakingFactoryV2.sol/AaveStakingFactoryV2.json +0 -148
  125. package/contracts/staking/aave/AaveStakingFactoryV2.sol +0 -93
  126. package/test/staking/GoodAaveStakingFactoryV2.test.ts +0 -122
  127. package/test/staking/UsdcAaveStakingV2.test.ts +0 -291
@@ -57,7 +57,9 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
57
57
  const goodFundManagerFactory = await ethers.getContractFactory(
58
58
  "GoodFundManager"
59
59
  );
60
- goodCompoundStakingFactory = await getStakingFactory("GoodCompoundStaking");
60
+ goodCompoundStakingFactory = await getStakingFactory(
61
+ "GoodCompoundStakingV2"
62
+ );
61
63
 
62
64
  const daiFactory = await ethers.getContractFactory("DAIMock");
63
65
  let {
@@ -216,6 +218,7 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
216
218
  expect(totalStakedBeforeStake).to.be.equal(0);
217
219
  expect(totalStakedAfterStake).to.be.gt(totalStakedBeforeStake);
218
220
  });
221
+
219
222
  it("it should stake donations with DAI", async () => {
220
223
  let stakeAmount = ethers.utils.parseEther("10");
221
224
  await dai["mint(address,uint256)"](donationsStaking.address, stakeAmount);
@@ -226,6 +229,13 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
226
229
  stakeAmount
227
230
  );
228
231
  });
232
+
233
+ it("it should reverted when there is no token to stake", async () => {
234
+ await expect(donationsStaking.stakeDonations()).to.be.revertedWith(
235
+ "no stakingToken to stake"
236
+ );
237
+ });
238
+
229
239
  it("it should stake donations with ETH according to 0.3% of pool", async () => {
230
240
  let stakeAmount = ethers.utils.parseEther("20");
231
241
  const pairContract = await ethers.getContractAt(
@@ -261,6 +271,7 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
261
271
  expect(stakeAmount).to.be.gt(maxAmount);
262
272
  expect(stakeAmount.sub(maxAmount)).to.be.equal(ethBalanceAfterStake); // check leftover ETH in contract
263
273
  });
274
+
264
275
  it("withdraw should reverted if caller not avatar", async () => {
265
276
  const tx = await donationsStaking
266
277
  .connect(staker)
@@ -268,6 +279,7 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
268
279
  .catch(e => e);
269
280
  expect(tx.message).to.have.string("only avatar can call this method");
270
281
  });
282
+
271
283
  it("it should withdraw donationStaking when caller is avatar and return funds to avatar", async () => {
272
284
  const totalStakedBeforeEnd = await donationsStaking.totalStaked();
273
285
  const avatarDaiBalanceBeforeEnd = await dai.balanceOf(avatar);
@@ -303,16 +315,9 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
303
315
 
304
316
  expect(totalStakedAfterEnd).to.be.equal(0);
305
317
  });
318
+
306
319
  it("it should set stakingContract when avatar call it ", async () => {
307
320
  let stakeAmount = ethers.utils.parseEther("6000"); // Max swap amount is around 5964 with current liquidity level so we should set it to higher number in order to test functionality
308
- const donationsStakingFactory = await ethers.getContractFactory(
309
- "DonationsStaking",
310
- {
311
- libraries: {
312
- UniswapV2SwapHelper: swapHelper.address
313
- }
314
- }
315
- );
316
321
 
317
322
  await dai["mint(address,uint256)"](donationsStaking.address, stakeAmount);
318
323
  await donationsStaking.stakeDonations();
@@ -340,7 +345,7 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
340
345
  .then(async contract => {
341
346
  await contract.init(
342
347
  bat.address,
343
- cDAI.address,
348
+ cBat.address,
344
349
  nameService.address,
345
350
  "Good BAT",
346
351
  "gBAT",
@@ -351,12 +356,7 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
351
356
  );
352
357
  return contract;
353
358
  });
354
- //let encodedData = donationsStakingFactory.interface.encodeFunctionData(
355
- // "setStakingContract",
356
- // [simpleStaking.address, [NULL_ADDRESS, bat.address]]
357
- //);
358
- //
359
- //await genericCall(donationsStaking.address, encodedData);
359
+
360
360
  await donationsStaking.setStakingContract(simpleStaking.address, [
361
361
  NULL_ADDRESS,
362
362
  bat.address
@@ -388,4 +388,9 @@ describe("DonationsStaking - DonationStaking contract that receives funds in ETH
388
388
  ); // It should send leftover stakingToken to avatar after swap to ETH in safeAmount
389
389
  expect(stakingAmountBeforeSet).to.be.gt(safeAmount); // maxSafeAmount must be smaller than actualstaking amount so we can verify that we hit the limit for transaction amount at once
390
390
  });
391
+
392
+ it("it should return version of DonationsStaking properly", async () => {
393
+ const version = await donationsStaking.getVersion();
394
+ expect(version).to.be.equal("2.0.0");
395
+ });
391
396
  });
@@ -50,36 +50,38 @@ describe("AaveStakingFactory", () => {
50
50
  await dao.setDAOAddress("AAVE", aave.address);
51
51
  let swapHelper = await ethers
52
52
  .getContractFactory("UniswapV2SwapHelper")
53
- .then((_) => _.deploy());
53
+ .then(_ => _.deploy());
54
54
 
55
55
  stakingFactory = (await ethers
56
56
  .getContractFactory("AaveStakingFactory", {
57
- libraries: { UniswapV2SwapHelper: swapHelper.address },
57
+ libraries: { UniswapV2SwapHelper: swapHelper.address }
58
58
  })
59
- .then((_) => _.deploy())) as AaveStakingFactory;
59
+ .then(_ => _.deploy())) as AaveStakingFactory;
60
60
  });
61
61
 
62
- it("should create proxy clone", async () => {
63
- const res = await (
64
- await stakingFactory.clone(usdc.address, ethers.constants.HashZero)
65
- ).wait();
66
- const log = res.events.find((_) => _.event === "Deployed");
67
- const detAddress = await stakingFactory.predictAddress(
68
- usdc.address,
69
- ethers.constants.HashZero
70
- );
62
+ // it("should create proxy clone", async () => {
63
+ // const res = await (
64
+ // await stakingFactory.clone(usdc.address, ethers.constants.HashZero)
65
+ // ).wait();
66
+ // const log = res.events.find((_) => _.event === "Deployed");
67
+ // const detAddress = await stakingFactory.predictAddress(
68
+ // usdc.address,
69
+ // ethers.constants.HashZero
70
+ // );
71
71
 
72
- expect(log).to.not.empty;
73
- expect(log.args.proxy).to.equal(detAddress);
74
- expect(log.args.token).to.equal(usdc.address);
75
- });
72
+ // expect(log).to.not.empty;
73
+ // expect(log.args.proxy).to.equal(detAddress);
74
+ // expect(log.args.token).to.equal(usdc.address);
75
+ // });
76
76
 
77
77
  it("should create and initialize clone", async () => {
78
78
  const ns = await ethers
79
79
  .getContractFactory("NameService")
80
- .then((_) => _.deploy());
80
+ .then(_ => _.deploy());
81
81
  const res = await (
82
- await stakingFactory.cloneAndInit(
82
+ await stakingFactory[
83
+ "cloneAndInit(address,address,address,uint64,address,address,address,address[])"
84
+ ](
83
85
  usdc.address,
84
86
  lendingPool.address,
85
87
  dao.nameService.address,
@@ -90,8 +92,9 @@ describe("AaveStakingFactory", () => {
90
92
  [usdc.address, dai]
91
93
  )
92
94
  ).wait();
93
- const log = res.events.find((_) => _.event === "Deployed");
95
+ const log = res.events.find(_ => _.event === "Deployed");
94
96
  const detAddress = await stakingFactory.predictAddress(
97
+ await stakingFactory.impl(),
95
98
  usdc.address,
96
99
  ethers.utils.solidityKeccak256(
97
100
  ["address", "address", "uint64", "address", "address", "address"],
@@ -101,7 +104,7 @@ describe("AaveStakingFactory", () => {
101
104
  5760,
102
105
  stakingFactory.address,
103
106
  incentiveController.address,
104
- aaveUsdOracle.address,
107
+ aaveUsdOracle.address
105
108
  ]
106
109
  )
107
110
  );
@@ -111,12 +114,12 @@ describe("AaveStakingFactory", () => {
111
114
 
112
115
  //check initialization
113
116
  const staking: GoodAaveStaking = (await ethers.getContractAt(
114
- "GoodAaveStaking",
117
+ "GoodAaveStakingV2",
115
118
  detAddress
116
119
  )) as GoodAaveStaking;
117
120
  expect(await staking.iToken()).to.equal(lendingPool.address);
118
121
  expect(await staking.token()).to.equal(usdc.address);
119
- expect(await staking.name()).to.equal("GoodAaveStaking USDC");
120
- expect(await staking.symbol()).to.equal("gUSDC");
122
+ expect(await staking.name()).to.equal("GoodAaveStakingV2 USDC");
123
+ expect(await staking.symbol()).to.equal("gaUSDC");
121
124
  });
122
125
  });
@@ -97,7 +97,9 @@ describe("SimpleDAISTAking - staking with cDAI mocks", () => {
97
97
  );
98
98
  compUsdOracle = await compUsdOracleFactory.deploy();
99
99
 
100
- goodCompoundStakingFactory = await getStakingFactory("GoodCompoundStaking");
100
+ goodCompoundStakingFactory = await getStakingFactory(
101
+ "GoodCompoundStakingV2"
102
+ );
101
103
 
102
104
  deployStaking = async (token, itoken) => {
103
105
  return goodCompoundStakingFactory.deploy().then(async contract => {
@@ -1256,16 +1258,6 @@ describe("SimpleDAISTAking - staking with cDAI mocks", () => {
1256
1258
  );
1257
1259
  });
1258
1260
 
1259
- it("should not withdraw interest if the recipient specified by the owner is the staking contract", async () => {
1260
- await advanceBlocks(BLOCK_INTERVAL);
1261
- await setDAOAddress("FUND_MANAGER", founder.address);
1262
- const error = await goodCompoundStaking
1263
- .collectUBIInterest(goodCompoundStaking.address)
1264
- .catch(e => e);
1265
- await setDAOAddress("FUND_MANAGER", goodFundManager.address);
1266
- expect(error.message).to.be.not.empty;
1267
- });
1268
-
1269
1261
  it("should pause the contract", async () => {
1270
1262
  let encodedCall = goodCompoundStakingFactory.interface.encodeFunctionData(
1271
1263
  "pause",
@@ -1,7 +1,7 @@
1
1
  import { ethers, upgrades } from "hardhat";
2
2
  import { BigNumber, Contract } from "ethers";
3
3
  import { expect } from "chai";
4
- import { GoodMarketMaker, GoodCompoundStaking } from "../../types";
4
+ import { GoodMarketMaker } from "../../types";
5
5
  import {
6
6
  createDAO,
7
7
  increaseTime,
@@ -56,7 +56,9 @@ describe("StakingRewards - staking with cDAI mocks and get Rewards in GoodDollar
56
56
  const goodFundManagerFactory = await ethers.getContractFactory(
57
57
  "GoodFundManager"
58
58
  );
59
- goodCompoundStakingFactory = await getStakingFactory("GoodCompoundStaking");
59
+ goodCompoundStakingFactory = await getStakingFactory(
60
+ "GoodCompoundStakingV2"
61
+ );
60
62
  goodCompoundStakingTestFactory = await getStakingFactory(
61
63
  "GoodCompoundStakingTest"
62
64
  );
@@ -307,11 +309,13 @@ describe("StakingRewards - staking with cDAI mocks and get Rewards in GoodDollar
307
309
  await dai
308
310
  .connect(staker)
309
311
  .approve(goodCompoundStaking.address, stakingAmount);
310
- const totalEffectiveStakesBeforeStake =
311
- await goodCompoundStaking.totalEffectiveStakes();
312
+ const totalEffectiveStakesBeforeStake = await goodCompoundStaking
313
+ .getStats()
314
+ .then(_ => _[3]);
312
315
  await goodCompoundStaking.connect(staker).stake(stakingAmount, 100, false);
313
- const totalEffectiveStakesAfterStake =
314
- await goodCompoundStaking.totalEffectiveStakes();
316
+ const totalEffectiveStakesAfterStake = await goodCompoundStaking
317
+ .getStats()
318
+ .then(_ => _[3]);
315
319
  await goodCompoundStaking
316
320
  .connect(staker)
317
321
  .withdrawStake(stakingAmount, false);
@@ -326,11 +330,13 @@ describe("StakingRewards - staking with cDAI mocks and get Rewards in GoodDollar
326
330
  await dai
327
331
  .connect(staker)
328
332
  .approve(goodCompoundStaking.address, stakingAmount);
329
- const totalEffectiveStakesBeforeStake =
330
- await goodCompoundStaking.totalEffectiveStakes();
333
+ const totalEffectiveStakesBeforeStake = await goodCompoundStaking
334
+ .getStats()
335
+ .then(_ => _[3]);
331
336
  await goodCompoundStaking.connect(staker).stake(stakingAmount, 0, false);
332
- const totalEffectiveStakesAfterStake =
333
- await goodCompoundStaking.totalEffectiveStakes();
337
+ const totalEffectiveStakesAfterStake = await goodCompoundStaking
338
+ .getStats()
339
+ .then(_ => _[3]);
334
340
  await goodCompoundStaking
335
341
  .connect(staker)
336
342
  .withdrawStake(stakingAmount, false);
@@ -1452,7 +1458,7 @@ describe("StakingRewards - staking with cDAI mocks and get Rewards in GoodDollar
1452
1458
  expect(activeContractsCount).to.be.equal(activeContractsCountAfterRemoved);
1453
1459
  });
1454
1460
  it("it should distribute rewards correctly when there is multiple stakers", async () => {
1455
- const simpleStaking1 = (await goodCompoundStakingTestFactory.deploy(
1461
+ const simpleStaking1 = await goodCompoundStakingTestFactory.deploy(
1456
1462
  bat.address,
1457
1463
  cBat.address,
1458
1464
  nameService.address,
@@ -1462,7 +1468,7 @@ describe("StakingRewards - staking with cDAI mocks and get Rewards in GoodDollar
1462
1468
  batUsdOracle.address,
1463
1469
  compUsdOracle.address,
1464
1470
  [bat.address, dai.address]
1465
- )) as GoodCompoundStaking;
1471
+ );
1466
1472
  const currentBlock = await ethers.provider.getBlockNumber();
1467
1473
  const rewardsPerBlock = BN.from("1000");
1468
1474
  let encodedData = goodFundManager.interface.encodeFunctionData(
@@ -1624,7 +1630,7 @@ describe("StakingRewards - staking with cDAI mocks and get Rewards in GoodDollar
1624
1630
  await genericCall(goodFundManager.address, encodedData, avatar, 0);
1625
1631
  });
1626
1632
  it("it should get staking reward even reward amount is too low", async () => {
1627
- const simpleStaking1 = (await goodCompoundStakingTestFactory.deploy(
1633
+ const simpleStaking1 = await goodCompoundStakingTestFactory.deploy(
1628
1634
  bat.address,
1629
1635
  cBat.address,
1630
1636
  nameService.address,
@@ -1634,7 +1640,7 @@ describe("StakingRewards - staking with cDAI mocks and get Rewards in GoodDollar
1634
1640
  batUsdOracle.address,
1635
1641
  compUsdOracle.address,
1636
1642
  [bat.address, dai.address]
1637
- )) as GoodCompoundStaking;
1643
+ );
1638
1644
 
1639
1645
  const currentBlock = await ethers.provider.getBlockNumber();
1640
1646
  const rewardsPerBlock = BN.from("100");
@@ -46,7 +46,9 @@ describe("SwapHelper - Helper library for swap on the Uniswap", () => {
46
46
  const swapHelperTestFactory = await ethers.getContractFactory(
47
47
  "SwapHelperTest"
48
48
  );
49
- goodCompoundStakingFactory = await getStakingFactory("GoodCompoundStaking");
49
+ goodCompoundStakingFactory = await getStakingFactory(
50
+ "GoodCompoundStakingV2"
51
+ );
50
52
  goodCompoundStakingTestFactory = await getStakingFactory(
51
53
  "GoodCompoundStakingTest"
52
54
  );
@@ -210,6 +212,7 @@ describe("SwapHelper - Helper library for swap on the Uniswap", () => {
210
212
  ["100", simpleStaking.address, 0, 10000, true]
211
213
  );
212
214
  await genericCall(goodFundManager.address, encodedData, avatar, 0);
215
+ console.log({ redeemedAmount, safeAmount });
213
216
  expect(reserve[0].sub(currentReserve[0])).to.be.lt(currentGains[1]);
214
217
  expect(currentReserve[0].sub(reserve[0])).to.be.equal(redeemedAmount);
215
218
  });
@@ -8,7 +8,7 @@ import { createDAO, deployUniswap, getStakingFactory } from "../helpers";
8
8
  const BN = ethers.BigNumber;
9
9
  export const NULL_ADDRESS = ethers.constants.AddressZero;
10
10
 
11
- describe("UsdcAaveStaking - staking with USDC mocks to AAVE interface", () => {
11
+ describe("UsdcAaveStakingV2 - staking with USDC mocks to AAVE interface", () => {
12
12
  let dai: Contract;
13
13
  let usdc: Contract;
14
14
  let pair: Contract, uniswapRouter: Contract;
@@ -29,7 +29,6 @@ describe("UsdcAaveStaking - staking with USDC mocks to AAVE interface", () => {
29
29
  lendingPool,
30
30
  setDAOAddress,
31
31
  genericCall,
32
- goodReserve,
33
32
  goodAaveStakingFactory;
34
33
  before(async () => {
35
34
  [founder, staker, ...signers] = await ethers.getSigners();
@@ -39,7 +38,7 @@ describe("UsdcAaveStaking - staking with USDC mocks to AAVE interface", () => {
39
38
  const goodFundManagerFactory = await ethers.getContractFactory(
40
39
  "GoodFundManager"
41
40
  );
42
- goodAaveStakingFactory = await getStakingFactory("GoodAaveStaking");
41
+ goodAaveStakingFactory = await getStakingFactory("GoodAaveStakingV2");
43
42
 
44
43
  const lendingPoolFactory = await ethers.getContractFactory(
45
44
  "LendingPoolMock"
@@ -56,10 +55,8 @@ describe("UsdcAaveStaking - staking with USDC mocks to AAVE interface", () => {
56
55
  marketMaker: mm,
57
56
  daiAddress,
58
57
  genericCall: gc,
59
- COMP,
60
- reserve
58
+ COMP
61
59
  } = await createDAO();
62
- goodReserve = reserve;
63
60
  dai = await ethers.getContractAt("DAIMock", daiAddress);
64
61
  avatar = av;
65
62
  controller = ctrl;
@@ -240,8 +237,9 @@ describe("UsdcAaveStaking - staking with USDC mocks to AAVE interface", () => {
240
237
  expect(gdBalanceAfterCollectInterest.gt(gdBalanceBeforeCollectInterest));
241
238
  });
242
239
 
243
- it("it should collectRewards while collecting interest from aToken if there some earned reward as stkAAVE", async () => {
240
+ it("it should collect stkAAVE to Avatar when collecting interest", async () => {
244
241
  const stakingAmount = ethers.utils.parseUnits("100", 6);
242
+ const avatarBalance = await aave.balanceOf(avatar);
245
243
  await goodAaveStaking.stake(stakingAmount, "0", false);
246
244
  const currentGainsAfterStake = await goodAaveStaking.currentGains(
247
245
  false,
@@ -278,7 +276,24 @@ describe("UsdcAaveStaking - staking with USDC mocks to AAVE interface", () => {
278
276
  );
279
277
  expect(currentGainsAfterEarnRewards[4]).to.be.equal(0); // stkAAVE rewards shouldnt count as gain
280
278
  expect(currentGainsAfterCollectInterest[4]).to.be.equal("0");
281
- expect(await aave.balanceOf(goodReserve.address)).gt(0);
279
+ expect(await aave.balanceOf(avatar)).gt(avatarBalance);
280
+ });
281
+
282
+ it("should be able to transfer staked tokens", async () => {
283
+ const stakingAmount = ethers.utils.parseUnits("100", 6);
284
+
285
+ await goodAaveStaking.connect(staker).stake(stakingAmount, 0, false);
286
+
287
+ await lendingPool.giveInterestToUser("1500", goodAaveStaking.address); // increase interest by calling giveInterestToUser
288
+
289
+ await expect(
290
+ goodAaveStaking
291
+ .connect(staker)
292
+ .transfer(signers[0].address, stakingAmount)
293
+ ).not.reverted;
294
+ expect(await goodAaveStaking.balanceOf(signers[0].address)).to.eq(
295
+ stakingAmount
296
+ );
282
297
  });
283
298
  async function addLiquidity(
284
299
  token0: Contract,
@@ -83,7 +83,7 @@ describe("UBIScheme - network e2e tests", () => {
83
83
  "GoodFundManager"
84
84
  );
85
85
  const goodCompoundStakingFactory = await getStakingFactory(
86
- "GoodCompoundStaking"
86
+ "GoodCompoundStakingV2"
87
87
  );
88
88
  const deployedDAO = await createDAO();
89
89
  let {
@@ -197,7 +197,7 @@ describe("ProtocolUpgrade - Upgrade old protocol contracts to new ones", () => {
197
197
  deployment["test-mainnet"].GoodReserveCDai
198
198
  );
199
199
  newStakingContract = await ethers.getContractAt(
200
- "GoodCompoundStaking",
200
+ "GoodCompoundStakingV2",
201
201
  deployment["test-mainnet"].StakingContracts[0][0]
202
202
  );
203
203
  stakingAmountOfNewDonationStaking =
@@ -1,4 +0,0 @@
1
- {
2
- "_format": "hh-sol-dbg-1",
3
- "buildInfo": "../../../../build-info/432071a069fa44ffd3a7f92eee83d72e.json"
4
- }