From ee142e565fe79850a2a01291242ff3f9586b59ab Mon Sep 17 00:00:00 2001
From: Lasse Herskind <16536249+LHerskind@users.noreply.github.com>
Date: Thu, 3 Jun 2021 12:47:34 +0200
Subject: [PATCH] test: Add test for excess reward/dust

---
 .../test-aave/rewardAwareAToken.spec.ts       | 75 ++++++++++++++++++-
 1 file changed, 74 insertions(+), 1 deletion(-)

diff --git a/test-suites/test-aave/rewardAwareAToken.spec.ts b/test-suites/test-aave/rewardAwareAToken.spec.ts
index 3ee404a7..75f6be2f 100644
--- a/test-suites/test-aave/rewardAwareAToken.spec.ts
+++ b/test-suites/test-aave/rewardAwareAToken.spec.ts
@@ -1,6 +1,7 @@
 import BigNumberJs from 'bignumber.js';
+import { reverse } from 'dns';
 import { BigNumber } from 'ethers';
-import { parseEther } from 'ethers/lib/utils';
+import { formatEther, parseEther } from 'ethers/lib/utils';
 import { MAX_UINT_AMOUNT } from '../../helpers/constants';
 import { evmRevert, evmSnapshot, increaseTime } from '../../helpers/misc-utils';
 import { makeSuite, SignerWithAddress, TestEnv } from './helpers/make-suite';
@@ -230,6 +231,78 @@ makeSuite('Reward Aware AToken', (testEnv: TestEnv) => {
       await claim(user4);
     });
 
+    it('Annoying case. Four users with different portions of REW via the aToken contract (withdraw before last claim)', async () => {
+      const {
+        users: [user1, user2, user3, user4],
+        rew,
+        aRew,
+        pool,
+      } = testEnv;
+      let users = [user1, user2]; //, user3, user4];
+
+      const printState = async () => {
+        let summedClaimable = BigNumber.from(0);
+        for (let i = 0; i < users.length; i++) {
+          let usr = users[i];
+          console.log(
+            `\tUser rewards: ${formatEther(
+              await rew.balanceOf(usr.address)
+            )}. User claimable rewards: ${formatEther(
+              await aRew.getClaimableRewards(rew.address, usr.address)
+            )}. User aRew balance: ${formatEther(await aRew.balanceOf(usr.address))}`
+          );
+          summedClaimable = summedClaimable.add(
+            await aRew.getClaimableRewards(rew.address, usr.address)
+          );
+        }
+        console.log(
+          `\taRew Total supply: ${formatEther(
+            await aRew.totalSupply()
+          )}. Rewards in contract: ${formatEther(
+            await rew.balanceOf(aRew.address)
+          )}. Summed claimable: ${formatEther(summedClaimable)}`
+        );
+      };
+
+      // Deposits
+      console.log(`Mint and deposit`);
+      await mintAndDeposit(user1, false, parseEther('1'));
+      await mintAndDeposit(user2, false, parseEther('2.5'));
+      //await mintAndDeposit(user3, false, parseEther('4.7'));
+      //await mintAndDeposit(user4, false, parseEther('0.31'));
+
+      // Pass time to generate rewards
+      console.log(`IncreaseTime by 1000`);
+      await increaseTime(1000);
+
+      await printState();
+
+      // Claims and check rewards
+      console.log(`Claim`);
+      await claim(user1);
+
+      await printState();
+
+      // Pass time to generate rewards
+      console.log(`Increase time by 2713`);
+      await increaseTime(2713);
+
+      console.log(`Withdraws`);
+      for (let i = 0; i < users.length; i++) {
+        await pool
+          .connect(users[i].signer)
+          .withdraw(rew.address, MAX_UINT_AMOUNT, users[i].address);
+      }
+
+      // Claims and check rewards
+      console.log(`Claim`);
+      for (let i = 0; i < users.length; i++) {
+        await claim(users[i]);
+      }
+
+      await printState();
+    });
+
     it('Two users with half the portion of REW via the aToken contract, one burns and them claims', async () => {
       const {
         users: [user1, user2],