234 lines
11 KiB
TypeScript
234 lines
11 KiB
TypeScript
import { expect } from 'chai'
|
|
import hre from "hardhat";
|
|
import {
|
|
ZeroAddress,
|
|
getBytes,
|
|
solidityPackedKeccak256,
|
|
formatEther,
|
|
JsonRpcProvider,
|
|
} from 'ethers'
|
|
|
|
import {
|
|
loadFixture,
|
|
} from "@nomicfoundation/hardhat-toolbox/network-helpers";
|
|
import { expandDecimals, increaseTime, mineBlock, reportGasUsed } from './shared/utilities';
|
|
const secondsOneDay = BigInt(24 * 60 * 60);
|
|
const secondsPerYear = 365 * 24 * 60 * 60;
|
|
// 1.5 / (365*24*60*60)
|
|
const rewardPerSecond = BigInt(1.5 * 10 ** 18) / BigInt(secondsPerYear) ;
|
|
// 47564688000
|
|
console.log('rewardPerSecond: ', rewardPerSecond.toString())
|
|
|
|
const blockTime = async (provider: any) => {
|
|
const block = await provider.getBlock('latest')
|
|
return block ? block.timestamp : 0
|
|
}
|
|
const showLog = async (tag: string, stakedGmxTracker: any, esCec: any, address: string) => {
|
|
console.log(tag+'\t', 'stake amount:', formatEther(await stakedGmxTracker.stakedAmounts(address)),
|
|
'claimable: ', formatEther(await stakedGmxTracker.claimable(address)),
|
|
'claimableReward: ', formatEther(await stakedGmxTracker.claimableReward(address)),
|
|
'esCec balance: ', formatEther(await esCec.balanceOf(address)),
|
|
)
|
|
}
|
|
describe('RewardRouter', function() {
|
|
async function deployOneContract() {
|
|
// Contracts are deployed using the first signer/account by default
|
|
const [owner, user0, user1, user2] = await hre.ethers.getSigners();
|
|
const verifier = owner.address;
|
|
|
|
const chainId = hre.network.config.chainId
|
|
|
|
const Cec = await hre.ethers.getContractFactory("MintableBaseToken");
|
|
const cec = await Cec.deploy("test cec", "cec");
|
|
const EsToken = await hre.ethers.getContractFactory("EsToken");
|
|
const esCec = await EsToken.deploy("test esCec", "esCec");
|
|
|
|
const RewardTracker = await hre.ethers.getContractFactory("RewardTracker");
|
|
const RewardDistributor = await hre.ethers.getContractFactory("RewardDistributor");
|
|
const stakedGmxTracker = await RewardTracker.deploy("Staked GMX", "sGMX");
|
|
const stakedGmxDistributor = await RewardDistributor.deploy(esCec.target, stakedGmxTracker.target);
|
|
await stakedGmxTracker.initialize([cec.target, esCec.target], stakedGmxDistributor.target);
|
|
await stakedGmxDistributor.updateLastDistributionTime();
|
|
|
|
const Vester = await hre.ethers.getContractFactory("Vester");
|
|
const vester = await Vester.deploy(
|
|
"Vested CEC",
|
|
"veCEC",
|
|
secondsPerYear,
|
|
esCec.target,
|
|
ZeroAddress,
|
|
cec.target,
|
|
ZeroAddress,
|
|
);
|
|
|
|
await stakedGmxTracker.setInPrivateTransferMode(true)
|
|
await stakedGmxTracker.setInPrivateStakingMode(true)
|
|
|
|
// await esCec.setInPrivateTransferMode(true)
|
|
|
|
const RewardRouter = await hre.ethers.getContractFactory("RewardRouter");
|
|
const rewardRouter = await RewardRouter.deploy(
|
|
cec.target,
|
|
esCec.target,
|
|
stakedGmxTracker.target,
|
|
vester.target,
|
|
);
|
|
|
|
await esCec.setMinter(owner.address, true)
|
|
await esCec.mint(stakedGmxDistributor.target, expandDecimals(50000, 18))
|
|
await stakedGmxDistributor.setTokensPerInterval(rewardPerSecond)
|
|
|
|
await stakedGmxTracker.setHandler(rewardRouter.target, true)
|
|
await esCec.setMinter(vester.target, true)
|
|
await esCec.setHandler(stakedGmxTracker.target, true)
|
|
|
|
return { owner, user0, user1, user2, chainId, cec, esCec, stakedGmxTracker, stakedGmxDistributor, vester, rewardRouter };
|
|
}
|
|
describe("Deployment", function () {
|
|
it('should deploy RewardRouter', async function() {
|
|
const { chainId } = await loadFixture(deployOneContract);
|
|
// expect((await nftClaimer.mintConfig()).mintPrice).to.equal(100);
|
|
});
|
|
})
|
|
describe("Staking", function () {
|
|
it("stakeGmxForAccount, stakeGmx, stakeEsCec, unstakeGmx, unstakeEsGmx, claimEsCec, claimFees, compound, batchCompoundForAccounts", async () => {
|
|
const {owner, user0, user1, user2, chainId, cec, esCec, stakedGmxTracker, stakedGmxDistributor, vester, rewardRouter} = await loadFixture(deployOneContract);
|
|
const wallet = owner
|
|
const provider = wallet.provider;
|
|
await cec.setMinter(wallet.address, true)
|
|
await cec.mint(user0.address, expandDecimals(1500, 18))
|
|
expect(await cec.balanceOf(user0.address)).eq(expandDecimals(1500, 18))
|
|
|
|
// @ts-ignore
|
|
await cec.connect(user0).approve(stakedGmxTracker.target, expandDecimals(1000, 18))
|
|
// @ts-ignore
|
|
await expect(rewardRouter.connect(user0).stakeCecForAccount(user1.address, expandDecimals(1000, 18)))
|
|
.to.be.revertedWith("Governable: forbidden")
|
|
|
|
await rewardRouter.setGov(user0.address)
|
|
// @ts-ignore
|
|
await rewardRouter.connect(user0).stakeCecForAccount(user1.address, expandDecimals(800, 18))
|
|
expect(await cec.balanceOf(user0.address)).eq(expandDecimals(700, 18))
|
|
|
|
await cec.mint(user1.address, expandDecimals(200, 18))
|
|
expect(await cec.balanceOf(user1.address)).eq(expandDecimals(200, 18))
|
|
// @ts-ignore
|
|
await cec.connect(user1).approve(stakedGmxTracker.target, expandDecimals(200, 18))
|
|
// @ts-ignore
|
|
await rewardRouter.connect(user1).stakeCec(expandDecimals(200, 18))
|
|
expect(await cec.balanceOf(user1.address)).eq(0)
|
|
|
|
expect(await stakedGmxTracker.stakedAmounts(user0.address)).eq(0)
|
|
expect(await stakedGmxTracker.depositBalances(user0.address, cec.target)).eq(0)
|
|
expect(await stakedGmxTracker.stakedAmounts(user1.address)).eq(expandDecimals(1000, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, cec.target)).eq(expandDecimals(1000, 18))
|
|
|
|
const totalSupply = await stakedGmxTracker.totalSupply()
|
|
console.log('totalSupply: ', formatEther(totalSupply))
|
|
await showLog('init', stakedGmxTracker, esCec, user1.address)
|
|
await increaseTime(provider, Number(secondsOneDay))
|
|
await mineBlock(provider)
|
|
await showLog('1day', stakedGmxTracker, esCec, user1.address)
|
|
expect(await stakedGmxTracker.claimable(user0.address)).eq(0)
|
|
expect(await stakedGmxTracker.claimable(user1.address)).gt(expandDecimals(4, 18))
|
|
expect(await stakedGmxTracker.claimable(user1.address)).lt(expandDecimals(5, 18))
|
|
|
|
|
|
|
|
// await timelock.signalMint(esCec.target, tokenManager.address, expandDecimals(500, 18))
|
|
await increaseTime(provider, 20)
|
|
await mineBlock(provider)
|
|
|
|
// await timelock.processMint(esCec.target, tokenManager.address, expandDecimals(500, 18))
|
|
// await esCec.connect(tokenManager).transferFrom(tokenManager.address, user2.address, expandDecimals(500, 18))
|
|
await esCec.mint(user2.address, expandDecimals(500, 18))
|
|
// @ts-ignore
|
|
await esCec.connect(user2).approve(stakedGmxTracker.target, expandDecimals(500, 18))
|
|
// @ts-ignore
|
|
await rewardRouter.connect(user2).stakeEsCec(expandDecimals(500, 18))
|
|
|
|
expect(await stakedGmxTracker.stakedAmounts(user0.address)).eq(0)
|
|
expect(await stakedGmxTracker.depositBalances(user0.address, cec.target)).eq(0)
|
|
expect(await stakedGmxTracker.stakedAmounts(user1.address)).eq(expandDecimals(1000, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, cec.target)).eq(expandDecimals(1000, 18))
|
|
expect(await stakedGmxTracker.stakedAmounts(user2.address)).eq(expandDecimals(500, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user2.address, esCec.target)).eq(expandDecimals(500, 18))
|
|
|
|
|
|
|
|
await increaseTime(provider, Number(secondsOneDay))
|
|
await mineBlock(provider)
|
|
|
|
expect(await stakedGmxTracker.claimable(user0.address)).eq(0)
|
|
expect(await stakedGmxTracker.claimable(user1.address)).gt(expandDecimals(8, 18))
|
|
expect(await stakedGmxTracker.claimable(user1.address)).lt(expandDecimals(9, 18))
|
|
expect(await stakedGmxTracker.claimable(user2.address)).gt(expandDecimals(2, 18))
|
|
expect(await stakedGmxTracker.claimable(user2.address)).lt(expandDecimals(5, 18))
|
|
|
|
await showLog('2day', stakedGmxTracker, esCec, user1.address)
|
|
|
|
expect(await esCec.balanceOf(user1.address)).eq(0)
|
|
// @ts-ignore
|
|
await rewardRouter.connect(user1).claimEsCec()
|
|
expect(await esCec.balanceOf(user1.address)).gt(expandDecimals(8, 18))
|
|
expect(await esCec.balanceOf(user1.address)).lt(expandDecimals(9, 18))
|
|
|
|
|
|
|
|
expect(await esCec.balanceOf(user2.address)).eq(0)
|
|
// @ts-ignore
|
|
await rewardRouter.connect(user2).claimEsCec()
|
|
expect(await esCec.balanceOf(user2.address)).gt(expandDecimals(2, 18))
|
|
expect(await esCec.balanceOf(user2.address)).lt(expandDecimals(5, 18))
|
|
|
|
|
|
|
|
await increaseTime(provider, Number(secondsOneDay))
|
|
await mineBlock(provider)
|
|
|
|
|
|
|
|
await increaseTime(provider, Number(secondsOneDay))
|
|
await mineBlock(provider)
|
|
await showLog('claim cec 2day', stakedGmxTracker, esCec, user1.address)
|
|
// @ts-ignore
|
|
await rewardRouter.connect(user1).stakeEsCec(await esCec.balanceOf(user1.address))
|
|
|
|
await showLog('compound', stakedGmxTracker, esCec, user1.address)
|
|
expect(await stakedGmxTracker.stakedAmounts(user1.address)).gt(expandDecimals(1008, 18))
|
|
expect(await stakedGmxTracker.stakedAmounts(user1.address)).lt(expandDecimals(1009, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, cec.target)).eq(expandDecimals(1000, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, esCec.target)).gt(expandDecimals(8, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, esCec.target)).lt(expandDecimals(9, 18))
|
|
|
|
|
|
|
|
expect(await cec.balanceOf(user1.address)).eq(0)
|
|
// @ts-ignore
|
|
await rewardRouter.connect(user1).unstakeCec(expandDecimals(300, 18))
|
|
expect(await cec.balanceOf(user1.address)).eq(expandDecimals(300, 18))
|
|
|
|
expect(await stakedGmxTracker.stakedAmounts(user1.address)).gt(expandDecimals(708, 18))
|
|
expect(await stakedGmxTracker.stakedAmounts(user1.address)).lt(expandDecimals(709, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, cec.target)).eq(expandDecimals(700, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, esCec.target)).gt(expandDecimals(8, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, esCec.target)).lt(expandDecimals(9, 18))
|
|
|
|
|
|
const esGmxBalance1 = await esCec.balanceOf(user1.address)
|
|
const esGmxUnstakeBalance1 = await stakedGmxTracker.depositBalances(user1.address, esCec.target)
|
|
// @ts-ignore
|
|
await rewardRouter.connect(user1).unstakeEsCec(esGmxUnstakeBalance1)
|
|
expect(await esCec.balanceOf(user1.address)).eq(esGmxBalance1 + esGmxUnstakeBalance1)
|
|
|
|
expect(await stakedGmxTracker.stakedAmounts(user1.address)).eq(expandDecimals(700, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, cec.target)).eq(expandDecimals(700, 18))
|
|
expect(await stakedGmxTracker.depositBalances(user1.address, esCec.target)).eq(0)
|
|
|
|
|
|
// @ts-ignore
|
|
await expect(rewardRouter.connect(user1).unstakeEsCec(expandDecimals(1, 18)))
|
|
.to.be.revertedWith("RewardTracker: _amount exceeds depositBalance")
|
|
})
|
|
})
|
|
}) |