Skip to content

Instantly share code, notes, and snippets.

@Dliteofficial
Created November 21, 2023 15:21
Show Gist options
  • Save Dliteofficial/c8ee40ff9661b8fac09738c25d0ffe9e to your computer and use it in GitHub Desktop.
Save Dliteofficial/c8ee40ff9661b8fac09738c25d0ffe9e to your computer and use it in GitHub Desktop.
//SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.20;
import "forge-std/Test.sol";
import {Portal} from "contracts/Portal.sol";
import {MintBurnToken} from "contracts/MintBurnToken.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract PortalTest is Test {
Portal portal;
MintBurnToken bToken;
MintBurnToken portalEnergy;
IERC20 principalToken;
IERC20 PSM;
address public constant OWNER = address(1);
uint256 FUNDING_PHASE_DURATION = 432000;
uint256 FUNDING_EXCHANGE_RATIO = 550;
uint256 FUNDING_REWARD_RATE = 10;
address PRINCIPAL_TOKEN_ADDRESS = 0x4307fbDCD9Ec7AEA5a1c2958deCaa6f316952bAb; //(HLP token)
address PSM_ADDRESS = 0x17A8541B82BF67e10B0874284b4Ae66858cb1fd5; //(Possum PSM token)
address B_TOKEN = address(new MintBurnToken(OWNER, "BToken", "BToken"));
address PORTAL_ENERGY = address(new MintBurnToken(OWNER, "Portal Energy", "PortalEnergy"));
uint256 TERMINAL_MAX_LOCK_DURATION = 157_680_000;
uint256 AMOUNT_TO_CONVERT = 100_000 ether;
address FUNDER_1;
address USER_1;
address USER_2;
function setUp() public {
bToken = MintBurnToken(B_TOKEN);
portalEnergy = MintBurnToken(PORTAL_ENERGY);
PSM = IERC20(PSM_ADDRESS);
principalToken = IERC20(PRINCIPAL_TOKEN_ADDRESS);
portal = new Portal(
FUNDING_PHASE_DURATION,
FUNDING_EXCHANGE_RATIO,
FUNDING_REWARD_RATE,
PRINCIPAL_TOKEN_ADDRESS,
PSM_ADDRESS,
B_TOKEN,
PORTAL_ENERGY,
TERMINAL_MAX_LOCK_DURATION,
AMOUNT_TO_CONVERT
);
vm.label(address(portal), "Possum Portal Contract");
vm.prank(OWNER);
bToken.transferOwnership(address(portal));
vm.prank(OWNER);
portalEnergy.transferOwnership(address(portal));
assertEq(portal.PRINCIPAL_TOKEN_ADDRESS(), PRINCIPAL_TOKEN_ADDRESS);
FUNDER_1 = makeAddr("Funder One");
vm.label(FUNDER_1, "FUNDER ONE");
deal(PSM_ADDRESS, FUNDER_1, 100_000 ether);
assertEq(PSM.balanceOf(FUNDER_1), 100_000 ether);
USER_1 = makeAddr("User One");
vm.label(USER_1, "USER ONE");
deal(PRINCIPAL_TOKEN_ADDRESS, USER_1, 1_000 ether);
assertEq(principalToken.balanceOf(USER_1), 1_000 ether);
USER_2 = makeAddr("User Two");
vm.label(USER_2, "USER TWO");
deal(PRINCIPAL_TOKEN_ADDRESS, USER_2, 100 ether);
assertEq(principalToken.balanceOf(USER_2), 100 ether);
}
function _fundPortal() internal {
vm.startPrank(FUNDER_1);
PSM.approve(address(portal), PSM.balanceOf(FUNDER_1));
portal.contributeFunding(PSM.balanceOf(FUNDER_1));
assertEq(PSM.balanceOf(FUNDER_1), 0);
console.log("FUNDER_1 now has %s Btokens", bToken.balanceOf(FUNDER_1)/1 ether);
}
function _user1Stake() internal {
_fundPortal();
vm.warp(block.timestamp + FUNDING_PHASE_DURATION);
portal.activatePortal();
changePrank(USER_1);
principalToken.approve(address(portal), principalToken.balanceOf(USER_1));
portal.stake(principalToken.balanceOf(USER_1));
( , , , , , uint PEValue, ) = portal.accounts(USER_1);
console.log("USER_1 now has %s portal Energy", PEValue);
}
function test__burnBTokens() public {
_user1Stake();
changePrank(FUNDER_1);
console.log("Funding Reward Pool has %s value in it", portal.fundingRewardPool());
bToken.approve(address(portal), bToken.balanceOf(FUNDER_1));
portal.burnBtokens(bToken.balanceOf(FUNDER_1));
assertEq(bToken.balanceOf(FUNDER_1), 0);
assertEq(PSM.balanceOf(FUNDER_1), 0);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment