Skip to content

Commit

Permalink
feat: add rewards controller mock and fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
royvardhan committed May 2, 2024
1 parent e1130c3 commit b5d6ec2
Show file tree
Hide file tree
Showing 9 changed files with 209 additions and 143 deletions.
12 changes: 12 additions & 0 deletions src/facets/DiamondManagerFacet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,14 @@ contract DiamondManagerFacet {
s.isSeasonClaimed[s.currentSeasonId] = true;
}

function setRewardControllerAddress(address _rewardsControllerAddress) external onlyOwner {
if (_rewardsControllerAddress == address(0)) {
revert DiamondManagerFacet__Invalid_Address();
}
s.rewardsControllerAddress = _rewardsControllerAddress;
emit RewardsControllerAddressSet(_rewardsControllerAddress);
}

// Getters

function getRewardTokenToDistribute(uint256 _seasonId) external view returns (uint256) {
Expand Down Expand Up @@ -364,4 +372,8 @@ contract DiamondManagerFacet {
function getSeasonIsClaimed(uint256 seasonId) external view returns (bool) {
return s.isSeasonClaimed[seasonId];
}

function getUnlockDiscountForStratosphereMember(uint256 tier) external view returns (uint256) {
return s.unlockTimestampDiscountForStratosphereMembers[tier];
}
}
2 changes: 1 addition & 1 deletion src/interfaces/IRewardsController.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
pragma solidity 0.8.18;

interface IRewardsController {
function tierOf(uint256 tokenId) external view returns (uint256);
function tierOf(uint256 tokenId) external view returns (uint8);
}
1 change: 1 addition & 0 deletions src/libraries/LStratosphere.sol
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ library LStratosphere {
) internal view returns (bool isStratosphereMember, uint8 tier) {
IStratosphere _stratosphere = IStratosphere(s.stratosphereAddress);
uint256 _tokenId = _stratosphere.tokenIdOf(_address);

if (_tokenId > 0) {
isStratosphereMember = true;
IRewardsController _rewardsController = IRewardsController(s.rewardsControllerAddress);
Expand Down
113 changes: 61 additions & 52 deletions test/foundry/Facets/BoostFacet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { DiamondManagerFacet } from "src/facets/DiamondManagerFacet.sol";
import { ERC20Mock } from "test/foundry/mocks/ERC20Mock.sol";
import { StratosphereMock } from "test/foundry/mocks/StratosphereMock.sol";
import { LPercentages } from "src/libraries/LPercentages.sol";
import { RewardsControllerMock } from "test/foundry/mocks/RewardsControllerMock.sol";

contract BoostFacetTest is DiamondTest {
// StdCheats cheats = StdCheats(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
Expand All @@ -18,15 +19,21 @@ contract BoostFacetTest is DiamondTest {
ClaimFacet internal claimFacet;
BoostFacet internal boostFacet;
DiamondManagerFacet internal diamondManagerFacet;
RewardsControllerMock internal rewardsControllerMock;

// setup addresses
address feeReceiver1 = makeAddr("feeReceiver1");
address feeReceiver2 = makeAddr("feeReceiver2");
address diamondOwner = makeAddr("diamondOwner");
address user = makeAddr("user");

// Stratosphere Mocks
address stratosphereMemberBasic = makeAddr("stratosphereMemberBasic");
address stratosphereMemberSilver = makeAddr("stratosphereMemberSilver");
address stratosphereMemberGold = makeAddr("stratosphereMemberGold");
address stratosphereMemberPlatinum = makeAddr("stratosphereMemberPlatinum");
address stratosphereMemberDiamond = makeAddr("stratosphereMemberDiamond");
address stratosphereMemberObsidian = makeAddr("stratosphereMemberObsidian");
// setup test details
uint256 rewardTokenToDistribute = 10000 * 1e18;
uint256 testDepositAmount = 5000 * 1e18;
Expand Down Expand Up @@ -66,10 +73,12 @@ contract BoostFacetTest is DiamondTest {
depositFacet = DepositFacet(address(diamond));
claimFacet = ClaimFacet(address(diamond));
boostFacet = BoostFacet(address(diamond));
rewardsControllerMock = new RewardsControllerMock();

// Set up season details for deposit
rewardToken.mint(address(diamond), rewardTokenToDistribute);
diamondManagerFacet.startNewSeason(rewardTokenToDistribute);
diamondManagerFacet.setRewardControllerAddress(address(rewardsControllerMock));

vm.stopPrank();
}
Expand Down Expand Up @@ -126,58 +135,58 @@ contract BoostFacetTest is DiamondTest {
vm.stopPrank();
}

// FIXME: test case is failing because of Stratosphere tierOf being hardcoded to 0
// function test_BoostWithStratSilverLvl1() public {
// vm.startPrank(stratosphereMemberSilver);
// uint256 _currentSeasonId = diamondManagerFacet.getCurrentSeasonId();
// _mintAndDeposit(stratosphereMemberSilver, testDepositAmount);
// _fundUserWithBoostFeeToken(stratosphereMemberSilver, boostFeeLvl1);
// assertEq(feeToken.balanceOf(stratosphereMemberSilver), boostFeeLvl1);

// (uint256 depositPointsTillNow, uint256 boostPointsTillNow) = diamondManagerFacet.getUserPoints(
// stratosphereMemberSilver,
// _currentSeasonId
// );
// uint256 totalPointsTillNow = depositPointsTillNow + boostPointsTillNow;

// vm.warp(block.timestamp + 3 days);
// uint256 expectedTotalPoints = totalPointsTillNow + _calculatePoints(totalPointsTillNow, boostLvl1Tier2);

// boostFacet.claimBoost(1);

// uint256 lastBoostClaimedAmount = diamondManagerFacet.getUserLastBoostClaimedAmount(
// stratosphereMemberSilver,
// _currentSeasonId
// );
// assertEq(totalPointsTillNow + lastBoostClaimedAmount, expectedTotalPoints);
// assertEq(feeToken.balanceOf(stratosphereMemberSilver), 0);
// assertEq(feeToken.balanceOf(address(boostFacet)), boostFeeLvl1);
// vm.stopPrank();
// }

// FIXME: test case is failing because of Stratosphere tierOf being hardcoded to 0
// function test_BoostWithStratGoldLvl1() public {
// vm.startPrank(stratosphereMemberGold);
// _mintAndDeposit(stratosphereMemberGold, testDepositAmount);
// _fundUserWithBoostFeeToken(stratosphereMemberGold, boostFeeLvl1);
// assertEq(feeToken.balanceOf(stratosphereMemberGold), boostFeeLvl1);

// (uint256 depositPointsTillNow, uint256 boostPointsTillNow) = diamondManagerFacet.getUserPoints(
// stratosphereMemberGold,
// 1
// );
// uint256 totalPointsTillNow = depositPointsTillNow + boostPointsTillNow;

// vm.warp(block.timestamp + 3 days);
// uint256 expectedTotalPoints = totalPointsTillNow + _calculatePoints(totalPointsTillNow, boostLvl1Tier3);

// boostFacet.claimBoost(1);
// uint256 lastBoostClaimedAmount = diamondManagerFacet.getUserLastBoostClaimedAmount(stratosphereMemberGold, 1);
// assertEq(totalPointsTillNow + lastBoostClaimedAmount, expectedTotalPoints);
// assertEq(feeToken.balanceOf(stratosphereMemberGold), 0);
// assertEq(feeToken.balanceOf(address(boostFacet)), boostFeeLvl1);
// vm.stopPrank();
// }
function test_BoostWithStratSilverLvl1() public {
vm.startPrank(stratosphereMemberSilver);
uint256 _currentSeasonId = diamondManagerFacet.getCurrentSeasonId();
_mintAndDeposit(stratosphereMemberSilver, testDepositAmount);
_fundUserWithBoostFeeToken(stratosphereMemberSilver, boostFeeLvl1);
assertEq(feeToken.balanceOf(stratosphereMemberSilver), boostFeeLvl1);

(uint256 depositPointsTillNow, uint256 boostPointsTillNow) = diamondManagerFacet.getUserPoints(
stratosphereMemberSilver,
_currentSeasonId
);
uint256 totalPointsTillNow = depositPointsTillNow + boostPointsTillNow;

vm.warp(block.timestamp + 3 days);
uint256 expectedTotalPoints = totalPointsTillNow +
_calculatePoints(totalPointsTillNow, boostLvl1Tier2, testDepositAmount, boostLvl1Tier2);

boostFacet.claimBoost(1);

uint256 lastBoostClaimedAmount = diamondManagerFacet.getUserLastBoostClaimedAmount(
stratosphereMemberSilver,
_currentSeasonId
);
assertEq(totalPointsTillNow + lastBoostClaimedAmount, expectedTotalPoints);
assertEq(feeToken.balanceOf(stratosphereMemberSilver), 0);
assertEq(feeToken.balanceOf(address(boostFacet)), boostFeeLvl1);
vm.stopPrank();
}

function test_BoostWithStratGoldLvl1() public {
vm.startPrank(stratosphereMemberGold);
_mintAndDeposit(stratosphereMemberGold, testDepositAmount);
_fundUserWithBoostFeeToken(stratosphereMemberGold, boostFeeLvl1);
assertEq(feeToken.balanceOf(stratosphereMemberGold), boostFeeLvl1);

(uint256 depositPointsTillNow, uint256 boostPointsTillNow) = diamondManagerFacet.getUserPoints(
stratosphereMemberGold,
1
);
uint256 totalPointsTillNow = depositPointsTillNow + boostPointsTillNow;

vm.warp(block.timestamp + 3 days);
uint256 expectedTotalPoints = totalPointsTillNow +
_calculatePoints(totalPointsTillNow, boostLvl1Tier3, testDepositAmount, boostLvl1Tier3);

boostFacet.claimBoost(1);
uint256 lastBoostClaimedAmount = diamondManagerFacet.getUserLastBoostClaimedAmount(stratosphereMemberGold, 1);
assertEq(totalPointsTillNow + lastBoostClaimedAmount, expectedTotalPoints);
assertEq(feeToken.balanceOf(stratosphereMemberGold), 0);
assertEq(feeToken.balanceOf(address(boostFacet)), boostFeeLvl1);
vm.stopPrank();
}

function test_BoostWithStratBasicLvl2() public {
vm.startPrank(stratosphereMemberBasic);
Expand Down
4 changes: 4 additions & 0 deletions test/foundry/Facets/FeeCollectorFacet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { DiamondManagerFacet } from "src/facets/DiamondManagerFacet.sol";
import { ERC20Mock } from "test/foundry/mocks/ERC20Mock.sol";
import { StratosphereMock } from "test/foundry/mocks/StratosphereMock.sol";
import "src/libraries/LPercentages.sol";
import { RewardsControllerMock } from "test/foundry/mocks/RewardsControllerMock.sol";

contract FeeCollectorFacetTest is DiamondTest {
// StdCheats cheats = StdCheats(0x7109709ECfa91a80626fF3989D68f67F5b1DD12D);
Expand All @@ -22,6 +23,7 @@ contract FeeCollectorFacetTest is DiamondTest {
FeeCollectorFacet internal feeCollectorFacet;
ClaimFacet internal claimFacet;
BoostFacet internal boostFacet;
RewardsControllerMock internal rewardsControllerMock;
address depositFeeReceiver1 = makeAddr("depositFeeReceiver1");
address depositFeeReceiver2 = makeAddr("depositFeeReceiver2");
address stratosphereMemberBasic = makeAddr("stratosphereMemberBasic");
Expand All @@ -37,6 +39,7 @@ contract FeeCollectorFacetTest is DiamondTest {
feeCollectorFacet = FeeCollectorFacet(address(diamond));
claimFacet = ClaimFacet(address(diamond));
boostFacet = BoostFacet(address(diamond));
rewardsControllerMock = new RewardsControllerMock();

// diamondManagerFacet.setCurrentSeasonId(1);
// diamondManagerFacet.setSeasonEndTimestamp(1, block.timestamp + 30 days);
Expand All @@ -51,6 +54,7 @@ contract FeeCollectorFacetTest is DiamondTest {
depositFeeProportions[1] = 2500;
diamondManagerFacet.setUnlockFeeReceivers(depositFeeReceivers, depositFeeProportions);
diamondManagerFacet.setBoostFeeReceivers(depositFeeReceivers, depositFeeProportions);
diamondManagerFacet.setRewardControllerAddress(address(rewardsControllerMock));

vm.stopPrank();
}
Expand Down
87 changes: 51 additions & 36 deletions test/foundry/Facets/UnlockFacet.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,39 @@ import { DepositFacet } from "src/facets/DepositFacet.sol";
import { DiamondManagerFacet } from "src/facets/DiamondManagerFacet.sol";
import { ERC20Mock } from "test/foundry/mocks/ERC20Mock.sol";
import { StratosphereMock } from "test/foundry/mocks/StratosphereMock.sol";
import { RewardsControllerMock } from "test/foundry/mocks/RewardsControllerMock.sol";
import { LPercentages } from "src/libraries/LPercentages.sol";

contract UnlockFacetTest is DiamondTest {
LiquidMiningDiamond internal diamond;
UnlockFacet internal unlockFacet;
DepositFacet internal depositFacet;
DiamondManagerFacet internal diamondManagerFacet;
RewardsControllerMock internal rewardsControllerMock;
address depositFeeReceiver1 = makeAddr("depositFeeReceiver1");
address depositFeeReceiver2 = makeAddr("depositFeeReceiver2");
address unlockFeeReceiver1 = makeAddr("unlockFeeReceiver1");
address unlockFeeReceiver2 = makeAddr("unlockFeeReceiver2");

// Stratosphere Mocks

address stratosphereMemberBasic = makeAddr("stratosphereMemberBasic");
address stratosphereMemberSilver = makeAddr("stratosphereMemberSilver");
address stratosphereMemberGold = makeAddr("stratosphereMemberGold");
address stratosphereMemberPlatinum = makeAddr("stratosphereMemberPlatinum");
address stratosphereMemberDiamond = makeAddr("stratosphereMemberDiamond");
address stratosphereMemberObsidian = makeAddr("stratosphereMemberObsidian");

uint256 public constant COOLDOWN_PERIOD = 72 * 3600; // 72 Hours

function setUp() public {
vm.startPrank(makeAddr("diamondOwner"));

diamond = createDiamond();
diamondManagerFacet = DiamondManagerFacet(address(diamond));
unlockFacet = UnlockFacet(address(diamond));
depositFacet = DepositFacet(address(diamond));
rewardsControllerMock = new RewardsControllerMock();

depositToken.mint(makeAddr("user"), 100);

Expand All @@ -38,6 +53,7 @@ contract UnlockFacetTest is DiamondTest {
depositFeeProportions[0] = 7500;
depositFeeProportions[1] = 2500;
diamondManagerFacet.setUnlockFeeReceivers(depositFeeReceivers, depositFeeProportions);
diamondManagerFacet.setRewardControllerAddress(address(rewardsControllerMock));

vm.stopPrank();
}
Expand Down Expand Up @@ -147,40 +163,39 @@ contract UnlockFacetTest is DiamondTest {
assertEq(diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver2, address(depositToken)), 25);
}

// FIXME: test case is failing because of Stratosphere tierOf being hardcoded to 0
// function test_UnlockBeingGoldStratosphereMember() public {
// address stratosphereMemberGold = makeAddr("stratosphereMemberGold");

// vm.startPrank(stratosphereMemberGold);

// depositToken.increaseAllowance(address(depositFacet), 1000000);
// depositToken.mint(stratosphereMemberGold, 1000);

// vm.warp(block.timestamp + 5 days);

// depositFacet.deposit(1000);

// assertEq(diamondManagerFacet.getDepositAmountOfUser(stratosphereMemberGold, 1), 1000);
// assertEq(diamondManagerFacet.getDepositPointsOfUser(stratosphereMemberGold, 1), 25 * 1000);
// assertEq(diamondManagerFacet.getTotalDepositAmountOfSeason(1), 1000);
// assertEq(diamondManagerFacet.getTotalPointsOfSeason(1), 25 * 1000);

// unlockFacet.unlock(1000);
// assertEq(diamondManagerFacet.getDepositAmountOfUser(stratosphereMemberGold, 1), 0);
// assertEq(diamondManagerFacet.getDepositPointsOfUser(stratosphereMemberGold, 1), 0);
// assertEq(diamondManagerFacet.getTotalDepositAmountOfSeason(1), 0);
// assertEq(diamondManagerFacet.getTotalPointsOfSeason(1), 0);
// assertEq(diamondManagerFacet.getUnlockAmountOfUser(stratosphereMemberGold, 1), 1000 - 100);
// assertEq(
// diamondManagerFacet.getUnlockTimestampOfUser(stratosphereMemberGold, 1),
// block.timestamp + 3 days - 16848
// );
// assertEq(
// diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver1, address(depositToken)) +
// diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver2, address(depositToken)),
// 100
// );
// assertEq(diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver1, address(depositToken)), 75);
// assertEq(diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver2, address(depositToken)), 25);
// }
function test_UnlockBeingGoldStratosphereMember() public {
address stratosphereMemberGold = makeAddr("stratosphereMemberGold");

vm.startPrank(stratosphereMemberGold);

depositToken.increaseAllowance(address(depositFacet), 1000000);
depositToken.mint(stratosphereMemberGold, 1000);

vm.warp(block.timestamp + 5 days);

depositFacet.deposit(1000);

assertEq(diamondManagerFacet.getDepositAmountOfUser(stratosphereMemberGold, 1), 1000);
assertEq(diamondManagerFacet.getDepositPointsOfUser(stratosphereMemberGold, 1), 25 * 1000);
assertEq(diamondManagerFacet.getTotalDepositAmountOfSeason(1), 1000);
assertEq(diamondManagerFacet.getTotalPointsOfSeason(1), 25 * 1000);

unlockFacet.unlock(1000);
assertEq(diamondManagerFacet.getDepositAmountOfUser(stratosphereMemberGold, 1), 0);
assertEq(diamondManagerFacet.getDepositPointsOfUser(stratosphereMemberGold, 1), 0);
assertEq(diamondManagerFacet.getTotalDepositAmountOfSeason(1), 0);
assertEq(diamondManagerFacet.getTotalPointsOfSeason(1), 0);
assertEq(diamondManagerFacet.getUnlockAmountOfUser(stratosphereMemberGold, 1), 1000 - 100);
assertEq(
diamondManagerFacet.getUnlockTimestampOfUser(stratosphereMemberGold, 1),
block.timestamp + 3 days - LPercentages.percentage(COOLDOWN_PERIOD, 900)
);
assertEq(
diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver1, address(depositToken)) +
diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver2, address(depositToken)),
100
);
assertEq(diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver1, address(depositToken)), 75);
assertEq(diamondManagerFacet.getPendingWithdrawals(depositFeeReceiver2, address(depositToken)), 25);
}
}
Loading

0 comments on commit b5d6ec2

Please sign in to comment.