109 lines
5.4 KiB
TypeScript
109 lines
5.4 KiB
TypeScript
import { blockchainTests, constants, expect, verifyEventsFromLogs } from '@0x/contracts-test-utils';
|
|
import { BigNumber, StakingRevertErrors } from '@0x/utils';
|
|
import { LogWithDecodedArgs } from 'ethereum-types';
|
|
|
|
import { constants as stakingConstants } from '../../src/constants';
|
|
|
|
import { artifacts } from '../artifacts';
|
|
import {
|
|
TestMixinSchedulerContract,
|
|
TestMixinSchedulerEvents,
|
|
TestMixinSchedulerGoToNextEpochTestInfoEventArgs,
|
|
} from '../wrappers';
|
|
|
|
blockchainTests.resets('MixinScheduler unit tests', env => {
|
|
let testContract: TestMixinSchedulerContract;
|
|
|
|
before(async () => {
|
|
// Deploy contracts
|
|
testContract = await TestMixinSchedulerContract.deployFrom0xArtifactAsync(
|
|
artifacts.TestMixinScheduler,
|
|
env.provider,
|
|
env.txDefaults,
|
|
artifacts,
|
|
stakingConstants.NIL_ADDRESS,
|
|
stakingConstants.NIL_ADDRESS,
|
|
);
|
|
});
|
|
|
|
describe('getCurrentEpochEarliestEndTimeInSeconds', () => {
|
|
it('Should return the sum of `epoch start time + epoch duration`', async () => {
|
|
const testDeployedTimestamp = await testContract.testDeployedTimestamp().callAsync();
|
|
const epochDurationInSeconds = await testContract.epochDurationInSeconds().callAsync();
|
|
const expectedCurrentEpochEarliestEndTimeInSeconds = testDeployedTimestamp.plus(epochDurationInSeconds);
|
|
const currentEpochEarliestEndTimeInSeconds = await testContract
|
|
.getCurrentEpochEarliestEndTimeInSeconds()
|
|
.callAsync();
|
|
expect(currentEpochEarliestEndTimeInSeconds).to.bignumber.equal(
|
|
expectedCurrentEpochEarliestEndTimeInSeconds,
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('_initMixinScheduler', () => {
|
|
it('Should succeed if scheduler is not yet initialized (`currentEpochStartTimeInSeconds == 0`)', async () => {
|
|
const initCurrentEpochStartTimeInSeconds = constants.ZERO_AMOUNT;
|
|
const txReceipt = await testContract
|
|
.initMixinSchedulerTest(initCurrentEpochStartTimeInSeconds)
|
|
.awaitTransactionSuccessAsync();
|
|
// Assert `currentEpochStartTimeInSeconds` was properly initialized
|
|
const blockTimestamp = await env.web3Wrapper.getBlockTimestampAsync(txReceipt.blockNumber);
|
|
const currentEpochStartTimeInSeconds = await testContract.currentEpochStartTimeInSeconds().callAsync();
|
|
expect(currentEpochStartTimeInSeconds).to.bignumber.equal(blockTimestamp);
|
|
// Assert `currentEpoch` was properly initialized
|
|
const currentEpoch = await testContract.currentEpoch().callAsync();
|
|
expect(currentEpoch).to.bignumber.equal(1);
|
|
});
|
|
|
|
it('Should revert if scheduler is already initialized (`currentEpochStartTimeInSeconds != 0`)', async () => {
|
|
const initCurrentEpochStartTimeInSeconds = new BigNumber(10);
|
|
const tx = testContract
|
|
.initMixinSchedulerTest(initCurrentEpochStartTimeInSeconds)
|
|
.awaitTransactionSuccessAsync();
|
|
return expect(tx).to.revertWith(
|
|
new StakingRevertErrors.InitializationError(
|
|
StakingRevertErrors.InitializationErrorCodes.MixinSchedulerAlreadyInitialized,
|
|
),
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('_goToNextEpoch', () => {
|
|
it('Should succeed if epoch end time is strictly less than to block timestamp', async () => {
|
|
const epochEndTimeDelta = new BigNumber(-10);
|
|
const txReceipt = await testContract.goToNextEpochTest(epochEndTimeDelta).awaitTransactionSuccessAsync();
|
|
const currentEpoch = await testContract.currentEpoch().callAsync();
|
|
const currentEpochStartTimeInSeconds = await testContract.currentEpochStartTimeInSeconds().callAsync();
|
|
verifyEventsFromLogs(
|
|
txReceipt.logs,
|
|
[
|
|
{
|
|
oldEpoch: currentEpoch.minus(1),
|
|
blockTimestamp: currentEpochStartTimeInSeconds,
|
|
},
|
|
],
|
|
TestMixinSchedulerEvents.GoToNextEpochTestInfo,
|
|
);
|
|
});
|
|
|
|
it('Should succeed if epoch end time is equal to block timestamp', async () => {
|
|
const epochEndTimeDelta = constants.ZERO_AMOUNT;
|
|
const txReceipt = await testContract.goToNextEpochTest(epochEndTimeDelta).awaitTransactionSuccessAsync();
|
|
// tslint:disable-next-line no-unnecessary-type-assertion
|
|
const testLog: TestMixinSchedulerGoToNextEpochTestInfoEventArgs = (txReceipt.logs[0] as LogWithDecodedArgs<
|
|
TestMixinSchedulerGoToNextEpochTestInfoEventArgs
|
|
>).args;
|
|
const currentEpoch = await testContract.currentEpoch().callAsync();
|
|
const currentEpochStartTimeInSeconds = await testContract.currentEpochStartTimeInSeconds().callAsync();
|
|
expect(currentEpoch).to.bignumber.equal(testLog.oldEpoch.plus(1));
|
|
expect(currentEpochStartTimeInSeconds).to.bignumber.equal(testLog.blockTimestamp);
|
|
});
|
|
|
|
it('Should revert if epoch end time is strictly greater than block timestamp', async () => {
|
|
const epochEndTimeDelta = new BigNumber(10);
|
|
const tx = testContract.goToNextEpochTest(epochEndTimeDelta).awaitTransactionSuccessAsync();
|
|
return expect(tx).to.revertWith(new StakingRevertErrors.BlockTimestampTooLowError());
|
|
});
|
|
});
|
|
});
|