diff --git a/lib/forge-std b/lib/forge-std index 520f86e..98dbdd0 160000 --- a/lib/forge-std +++ b/lib/forge-std @@ -1 +1 @@ -Subproject commit 520f86e57e0682bdac282748a33a138a47f1d552 +Subproject commit 98dbdd0043a5c8bfc286a4b1c2ecf27daa6b4b79 diff --git a/src/facets/DiamondManagerFacet.sol b/src/facets/DiamondManagerFacet.sol index 97586d0..16dde44 100644 --- a/src/facets/DiamondManagerFacet.sol +++ b/src/facets/DiamondManagerFacet.sol @@ -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) { @@ -364,4 +372,8 @@ contract DiamondManagerFacet { function getSeasonIsClaimed(uint256 seasonId) external view returns (bool) { return s.isSeasonClaimed[seasonId]; } + + function getUnlockDiscount(uint256 tier) external view returns (uint256) { + return s.unlockTimestampDiscountForStratosphereMembers[tier]; + } } diff --git a/src/interfaces/IRewardsController.sol b/src/interfaces/IRewardsController.sol new file mode 100644 index 0000000..5f5f989 --- /dev/null +++ b/src/interfaces/IRewardsController.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; + +interface IRewardsController { + function tierOf(uint256 tokenId) external view returns (uint8); +} diff --git a/src/interfaces/IStratosphere.sol b/src/interfaces/IStratosphere.sol index 94553f4..4676d39 100644 --- a/src/interfaces/IStratosphere.sol +++ b/src/interfaces/IStratosphere.sol @@ -3,6 +3,4 @@ pragma solidity 0.8.18; interface IStratosphere { function tokenIdOf(address account) external view returns (uint256); - - function tierOf(uint256 tokenId) external view returns (uint8); } diff --git a/src/libraries/AppStorage.sol b/src/libraries/AppStorage.sol index 408ed7c..1004199 100644 --- a/src/libraries/AppStorage.sol +++ b/src/libraries/AppStorage.sol @@ -91,4 +91,8 @@ struct AppStorage { ////////////////// address gelatoExecutor; mapping(uint256 => bool) isSeasonClaimed; + ////////////////////////// + /// REWARDS CONTROLLER /// + ////////////////////////// + address rewardsControllerAddress; } diff --git a/src/libraries/LStratosphere.sol b/src/libraries/LStratosphere.sol index f04b274..3b62cdd 100644 --- a/src/libraries/LStratosphere.sol +++ b/src/libraries/LStratosphere.sol @@ -3,6 +3,7 @@ pragma solidity 0.8.18; import { AppStorage } from "./AppStorage.sol"; import { IStratosphere } from "../interfaces/IStratosphere.sol"; +import { IRewardsController } from "../interfaces/IRewardsController.sol"; /// @title LStratosphere /// @notice Library in charge of Stratosphere related logic @@ -22,9 +23,11 @@ library LStratosphere { ) internal view returns (bool isStratosphereMember, uint8 tier) { IStratosphere _stratosphere = IStratosphere(s.stratosphereAddress); uint256 _tokenId = _stratosphere.tokenIdOf(_address); + if (_tokenId > 0) { isStratosphereMember = true; - tier = 0; + IRewardsController _rewardsController = IRewardsController(s.rewardsControllerAddress); + tier = _rewardsController.tierOf(_tokenId); // Revert if rewardsControllerAddress is not set } } } diff --git a/src/upgradeInitializers/DiamondInit.sol b/src/upgradeInitializers/DiamondInit.sol index 83d7a86..20f4bb7 100644 --- a/src/upgradeInitializers/DiamondInit.sol +++ b/src/upgradeInitializers/DiamondInit.sol @@ -36,6 +36,7 @@ contract DiamondInit { address replenishmentPool; address labsMultisig; address burnWallet; + address rewardsController; } // You can add parameters to this function in order to pass in @@ -67,11 +68,11 @@ contract DiamondInit { s.unlockFee = _args.unlockFee; s.unlockTimestampDiscountForStratosphereMembers[0] = 500; // 5% - s.unlockTimestampDiscountForStratosphereMembers[1] = 550; // 5.5% - s.unlockTimestampDiscountForStratosphereMembers[2] = 650; // 6.5% - s.unlockTimestampDiscountForStratosphereMembers[3] = 800; // 8% - s.unlockTimestampDiscountForStratosphereMembers[4] = 1000; // 10% - s.unlockTimestampDiscountForStratosphereMembers[5] = 1500; // 15% + s.unlockTimestampDiscountForStratosphereMembers[1] = 650; // 6.5% + s.unlockTimestampDiscountForStratosphereMembers[2] = 900; // 9% + s.unlockTimestampDiscountForStratosphereMembers[3] = 1300; // 13% + s.unlockTimestampDiscountForStratosphereMembers[4] = 2000; // 20% + s.unlockTimestampDiscountForStratosphereMembers[5] = 3250; // 32.5% s.unlockFeeReceivers.push(_args.replenishmentPool); s.unlockFeeReceivers.push(_args.labsMultisig); s.unlockFeeReceivers.push(_args.burnWallet); @@ -148,5 +149,9 @@ contract DiamondInit { s.miningPassFeeReceiversShares.push(6500); // 65% s.miningPassFeeReceiversShares.push(3000); // 30% s.miningPassFeeReceiversShares.push(500); // 5% + + // Rewards Controller + + s.rewardsControllerAddress = _args.rewardsController; } } diff --git a/test/foundry/Facets/BoostFacet.t.sol b/test/foundry/Facets/BoostFacet.t.sol index 48da309..3b21e97 100644 --- a/test/foundry/Facets/BoostFacet.t.sol +++ b/test/foundry/Facets/BoostFacet.t.sol @@ -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); @@ -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; @@ -39,24 +46,24 @@ contract BoostFacetTest is DiamondTest { uint256 boostFeeLvl2 = 3 * 1e6; uint256 boostFeeLvl3 = 4 * 1e6; // boost data setup - uint256 boostLvl1Tier1 = 22; - uint256 boostLvl1Tier2 = 28; - uint256 boostLvl1Tier3 = 37; - uint256 boostLvl1Tier4 = 51; - uint256 boostLvl1Tier5 = 74; - uint256 boostLvl1Tier6 = 115; - uint256 boostLvl2Tier1 = 24; - uint256 boostLvl2Tier2 = 30; - uint256 boostLvl2Tier3 = 40; - uint256 boostLvl2Tier4 = 55; - uint256 boostLvl2Tier5 = 81; - uint256 boostLvl2Tier6 = 125; - uint256 boostLvl3Tier1 = 26; - uint256 boostLvl3Tier2 = 33; - uint256 boostLvl3Tier3 = 44; - uint256 boostLvl3Tier4 = 60; - uint256 boostLvl3Tier5 = 87; - uint256 boostLvl3Tier6 = 135; + uint256 boostLvl1Tier0 = 22; + uint256 boostLvl1Tier1 = 28; + uint256 boostLvl1Tier2 = 37; + uint256 boostLvl1Tier3 = 51; + uint256 boostLvl1Tier4 = 74; + uint256 boostLvl1Tier5 = 115; + uint256 boostLvl2Tier0 = 24; + uint256 boostLvl2Tier1 = 30; + uint256 boostLvl2Tier2 = 40; + uint256 boostLvl2Tier3 = 55; + uint256 boostLvl2Tier4 = 81; + uint256 boostLvl2Tier5 = 125; + uint256 boostLvl3Tier0 = 26; + uint256 boostLvl3Tier1 = 33; + uint256 boostLvl3Tier2 = 44; + uint256 boostLvl3Tier3 = 60; + uint256 boostLvl3Tier4 = 87; + uint256 boostLvl3Tier5 = 135; function setUp() public { vm.startPrank(diamondOwner); @@ -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(); } @@ -109,7 +118,7 @@ contract BoostFacetTest is DiamondTest { depositPointsTillNow, boostPointsTillNow, depositAmount, - boostLvl1Tier1 + boostLvl1Tier0 ); uint256 expectedTotalPoints = totalPointsTillNow + _caculatedPoints; console.log("[BoostFacetTest] expectedTotalPoints", expectedTotalPoints); @@ -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, boostLvl1Tier1, testDepositAmount, boostLvl1Tier1); + + 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, boostLvl1Tier2, testDepositAmount, boostLvl1Tier2); + + 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); @@ -196,7 +205,7 @@ contract BoostFacetTest is DiamondTest { vm.warp(block.timestamp + 3 days); uint256 expectedTotalPoints = totalPointsTillNow + - _calculatePoints(depositPointsTillNow, boostPointsTillNow, depositAmount, boostLvl2Tier1); + _calculatePoints(depositPointsTillNow, boostPointsTillNow, depositAmount, boostLvl2Tier0); boostFacet.claimBoost(2); uint256 lastBoostClaimedAmount = diamondManagerFacet.getUserLastBoostClaimedAmount( stratosphereMemberBasic, diff --git a/test/foundry/Facets/FeeCollectorFacet.t.sol b/test/foundry/Facets/FeeCollectorFacet.t.sol index 563c3d2..2b10b46 100644 --- a/test/foundry/Facets/FeeCollectorFacet.t.sol +++ b/test/foundry/Facets/FeeCollectorFacet.t.sol @@ -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); @@ -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"); @@ -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); @@ -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(); } diff --git a/test/foundry/Facets/UnlockFacet.t.sol b/test/foundry/Facets/UnlockFacet.t.sol index e0bc80b..90cb2ce 100644 --- a/test/foundry/Facets/UnlockFacet.t.sol +++ b/test/foundry/Facets/UnlockFacet.t.sol @@ -8,17 +8,31 @@ 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 hours; + function setUp() public { vm.startPrank(makeAddr("diamondOwner")); @@ -26,6 +40,7 @@ contract UnlockFacetTest is DiamondTest { diamondManagerFacet = DiamondManagerFacet(address(diamond)); unlockFacet = UnlockFacet(address(diamond)); depositFacet = DepositFacet(address(diamond)); + rewardsControllerMock = new RewardsControllerMock(); depositToken.mint(makeAddr("user"), 100); @@ -38,6 +53,7 @@ contract UnlockFacetTest is DiamondTest { depositFeeProportions[0] = 7500; depositFeeProportions[1] = 2500; diamondManagerFacet.setUnlockFeeReceivers(depositFeeReceivers, depositFeeProportions); + diamondManagerFacet.setRewardControllerAddress(address(rewardsControllerMock)); vm.stopPrank(); } @@ -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); + } } diff --git a/test/foundry/GelatoResolver.t.sol b/test/foundry/GelatoResolver.t.sol deleted file mode 100644 index d0bca51..0000000 --- a/test/foundry/GelatoResolver.t.sol +++ /dev/null @@ -1,65 +0,0 @@ -// SPDX-License-Identifier: Unlicense -pragma solidity 0.8.18; - -import "forge-std/Test.sol"; -import { GelatoResolver, ILiquidMiningDiamond } from "src/GelatoResolver.sol"; - -contract GelatoResolverTest is Test { - GelatoResolver gelatoResolver; - ILiquidMiningDiamond liquidMiningDiamond = ILiquidMiningDiamond(makeAddr("LiquidMiningDiamond")); - uint256 mainnetFork; - - function setUp() public { - // vm.createSelectFork(vm.rpcUrl("avalanche")); - gelatoResolver = new GelatoResolver(liquidMiningDiamond); - } - - function test_calculateReward() public { - uint256 seasonId = 1; - uint256 expectedReward = 15000 * 10 ** 18; - uint256 actualReward = gelatoResolver.calculateReward(seasonId); - assertEq(actualReward, expectedReward); - - seasonId = 2; - expectedReward = 14938200000000000000000; - actualReward = gelatoResolver.calculateReward(seasonId); - assertEq(actualReward, expectedReward); - - seasonId = 3; - expectedReward = 14876654616000000000000; - actualReward = gelatoResolver.calculateReward(seasonId); - assertEq(actualReward, expectedReward); - - seasonId = 4; - expectedReward = 14815362798982080000000; - actualReward = gelatoResolver.calculateReward(seasonId); - assertEq(actualReward, expectedReward); - - seasonId = 5; - expectedReward = 14754323504250273830400; - actualReward = gelatoResolver.calculateReward(seasonId); - assertEq(actualReward, expectedReward); - } - - function test_getNextMonthFirstDayTimestamp() public { - vm.warp(1696118400); // 2023-10-01 00:00:00 - uint256 expectedTimestamp = 1698796800; // 2023-11-01 00:00:00 - uint256 actualTimestamp = gelatoResolver.getNextMonthFirstDayTimestamp(); - assertEq(actualTimestamp, expectedTimestamp); - - vm.warp(1701388800); // 2023-12-01 00:00:00 - expectedTimestamp = 1704067200; // 2024-01-01 00:00:00 - actualTimestamp = gelatoResolver.getNextMonthFirstDayTimestamp(); - assertEq(actualTimestamp, expectedTimestamp); - - vm.warp(1704067200); // 2024-01-01 00:00:00 - expectedTimestamp = 1706745600; // 2024-02-01 00:00:00 - actualTimestamp = gelatoResolver.getNextMonthFirstDayTimestamp(); - assertEq(actualTimestamp, expectedTimestamp); - - vm.warp(1706745600); // 2024-02-01 00:00:00 - expectedTimestamp = 1709251200; // 2024-03-01 00:00:00 (Leap Year) - actualTimestamp = gelatoResolver.getNextMonthFirstDayTimestamp(); - assertEq(actualTimestamp, expectedTimestamp); - } -} diff --git a/test/foundry/mocks/RewardsControllerMock.sol b/test/foundry/mocks/RewardsControllerMock.sol new file mode 100644 index 0000000..565e964 --- /dev/null +++ b/test/foundry/mocks/RewardsControllerMock.sol @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.12; + +contract RewardsControllerMock { + function tierOf(uint256 _tokenId) external view returns (uint8) { + if (_tokenId == 1) { + return 0; + } else if (_tokenId == 2) { + return 1; + } else if (_tokenId == 3) { + return 2; + } else if (_tokenId == 4) { + return 3; + } else if (_tokenId == 5) { + return 4; + } else if (_tokenId == 6) { + return 5; + } else { + return 0; + } + } +} diff --git a/test/foundry/utils/DiamondTest.sol b/test/foundry/utils/DiamondTest.sol index df06cfa..e27d1c4 100644 --- a/test/foundry/utils/DiamondTest.sol +++ b/test/foundry/utils/DiamondTest.sol @@ -178,7 +178,7 @@ contract DiamondTest is Test { function setDiamondManagerFacet() private { DiamondManagerFacet diamondManager = new DiamondManagerFacet(); bytes4[] memory functionSelectors; - functionSelectors = new bytes4[](29); + functionSelectors = new bytes4[](31); functionSelectors[0] = diamondManager.setDepositToken.selector; functionSelectors[1] = diamondManager.setCurrentSeasonId.selector; functionSelectors[2] = diamondManager.setStratosphereAddress.selector; @@ -208,6 +208,8 @@ contract DiamondTest is Test { functionSelectors[26] = diamondManager.setBoostFeeReceivers.selector; functionSelectors[27] = diamondManager.setUnlockFeeReceivers.selector; functionSelectors[28] = diamondManager.getUserLastBoostClaimedAmount.selector; + functionSelectors[29] = diamondManager.setRewardControllerAddress.selector; + functionSelectors[30] = diamondManager.getUnlockDiscount.selector; cut.push( IDiamondCut.FacetCut({