* update abi-gen with new method interfaces * wip: get all packages to build * wip: get all packages to build * Fix two contract wrapper calls * Export necessary types part of the contract wrapper public interfaces * Revive and fix wrapper_unit_tests * Remove duplicate type * Fix lib_exchange_rich_error_decoder tests * Fix remaining test failures in contracts-* packages * Prettier fixes * remove transactionHelper * lint and update changelogs * Fix prettier * Revert changes to reference docs * Add back changelog already published and add revert changelog entry * Add missing CHANGELOG entries * Add missing comma * Update mesh-rpc-client dep * Update Mesh RPC logic in @0x/orderbook to v6.0.1-beta * Align package versions
169 lines
7.1 KiB
TypeScript
169 lines
7.1 KiB
TypeScript
import { BlockchainTestsEnvironment, expect, txDefaults } from '@0x/contracts-test-utils';
|
|
import { BigNumber } from '@0x/utils';
|
|
import { DecodedLogEntry, TransactionReceiptWithDecodedLogs } from 'ethereum-types';
|
|
import * as _ from 'lodash';
|
|
|
|
import { DecodedLogs, StakeInfo, StakeStatus } from '../../src/types';
|
|
import { artifacts } from '../artifacts';
|
|
import { TestCumulativeRewardTrackingContract, TestCumulativeRewardTrackingEvents } from '../wrappers';
|
|
|
|
import { StakingApiWrapper } from './api_wrapper';
|
|
import { toBaseUnitAmount } from './number_utils';
|
|
|
|
export enum TestAction {
|
|
Finalize,
|
|
Delegate,
|
|
Undelegate,
|
|
PayProtocolFee,
|
|
CreatePool,
|
|
}
|
|
|
|
interface TestLog {
|
|
event: string;
|
|
epoch: number;
|
|
}
|
|
|
|
export class CumulativeRewardTrackingSimulation {
|
|
private readonly _amountToStake = toBaseUnitAmount(100);
|
|
private readonly _protocolFee = new BigNumber(10);
|
|
private readonly _stakingApiWrapper: StakingApiWrapper;
|
|
private readonly _staker: string;
|
|
private readonly _poolOperator: string;
|
|
private readonly _takerAddress: string;
|
|
private readonly _exchangeAddress: string;
|
|
private _testCumulativeRewardTrackingContract?: TestCumulativeRewardTrackingContract;
|
|
private _poolId: string;
|
|
|
|
private static _extractTestLogs(txReceiptLogs: DecodedLogs): TestLog[] {
|
|
const logs = [];
|
|
for (const log of txReceiptLogs) {
|
|
const wantedEvents = [TestCumulativeRewardTrackingEvents.SetCumulativeReward] as string[];
|
|
if (wantedEvents.indexOf(log.event) !== -1) {
|
|
logs.push({
|
|
event: log.event,
|
|
epoch: log.args.epoch.toNumber(),
|
|
});
|
|
}
|
|
}
|
|
return logs;
|
|
}
|
|
|
|
private static _assertTestLogs(expectedSequence: TestLog[], txReceiptLogs: DecodedLogs): void {
|
|
const logs = CumulativeRewardTrackingSimulation._extractTestLogs(txReceiptLogs);
|
|
expect(logs.length).to.be.equal(expectedSequence.length);
|
|
for (let i = 0; i < expectedSequence.length; i++) {
|
|
const expectedLog = expectedSequence[i];
|
|
const actualLog = logs[i];
|
|
expect(expectedLog.event).to.exist('');
|
|
expect(actualLog.event, `testing event name of ${JSON.stringify(expectedLog)}`).to.be.equal(
|
|
expectedLog.event,
|
|
);
|
|
expect(actualLog.epoch, `testing epoch of ${JSON.stringify(expectedLog)}`).to.be.equal(expectedLog.epoch);
|
|
}
|
|
}
|
|
|
|
constructor(stakingApiWrapper: StakingApiWrapper, actors: string[]) {
|
|
this._stakingApiWrapper = stakingApiWrapper;
|
|
// setup actors
|
|
this._staker = actors[0];
|
|
this._poolOperator = actors[1];
|
|
this._takerAddress = actors[2];
|
|
this._exchangeAddress = actors[3];
|
|
this._poolId = '';
|
|
}
|
|
|
|
public async deployAndConfigureTestContractsAsync(env: BlockchainTestsEnvironment): Promise<void> {
|
|
// set exchange address
|
|
await this._stakingApiWrapper.stakingContract
|
|
.addExchangeAddress(this._exchangeAddress)
|
|
.awaitTransactionSuccessAsync();
|
|
this._testCumulativeRewardTrackingContract = await TestCumulativeRewardTrackingContract.deployFrom0xArtifactAsync(
|
|
artifacts.TestCumulativeRewardTracking,
|
|
env.provider,
|
|
txDefaults,
|
|
artifacts,
|
|
this._stakingApiWrapper.wethContract.address,
|
|
this._stakingApiWrapper.zrxVaultContract.address,
|
|
);
|
|
}
|
|
|
|
public getTestCumulativeRewardTrackingContract(): TestCumulativeRewardTrackingContract {
|
|
if (this._testCumulativeRewardTrackingContract === undefined) {
|
|
throw new Error(`Contract has not been deployed. Run 'deployAndConfigureTestContractsAsync'.`);
|
|
}
|
|
return this._testCumulativeRewardTrackingContract;
|
|
}
|
|
|
|
public async runTestAsync(
|
|
initActions: TestAction[],
|
|
testActions: TestAction[],
|
|
expectedTestLogs: TestLog[],
|
|
): Promise<void> {
|
|
await this._executeActionsAsync(initActions);
|
|
await this._stakingApiWrapper.stakingProxyContract
|
|
.attachStakingContract(this.getTestCumulativeRewardTrackingContract().address)
|
|
.awaitTransactionSuccessAsync();
|
|
const testLogs = await this._executeActionsAsync(testActions);
|
|
CumulativeRewardTrackingSimulation._assertTestLogs(expectedTestLogs, testLogs);
|
|
}
|
|
|
|
private async _executeActionsAsync(actions: TestAction[]): Promise<DecodedLogs> {
|
|
const combinedLogs = [] as DecodedLogs;
|
|
for (const action of actions) {
|
|
let receipt: TransactionReceiptWithDecodedLogs | undefined;
|
|
let logs = [] as DecodedLogs;
|
|
switch (action) {
|
|
case TestAction.Finalize:
|
|
logs = await this._stakingApiWrapper.utils.skipToNextEpochAndFinalizeAsync();
|
|
break;
|
|
|
|
case TestAction.Delegate:
|
|
await this._stakingApiWrapper.stakingContract.stake(this._amountToStake).sendTransactionAsync({
|
|
from: this._staker,
|
|
});
|
|
receipt = await this._stakingApiWrapper.stakingContract
|
|
.moveStake(
|
|
new StakeInfo(StakeStatus.Undelegated),
|
|
new StakeInfo(StakeStatus.Delegated, this._poolId),
|
|
this._amountToStake,
|
|
)
|
|
.awaitTransactionSuccessAsync({ from: this._staker });
|
|
break;
|
|
|
|
case TestAction.Undelegate:
|
|
receipt = await this._stakingApiWrapper.stakingContract
|
|
.moveStake(
|
|
new StakeInfo(StakeStatus.Delegated, this._poolId),
|
|
new StakeInfo(StakeStatus.Undelegated),
|
|
this._amountToStake,
|
|
)
|
|
.awaitTransactionSuccessAsync({ from: this._staker });
|
|
break;
|
|
|
|
case TestAction.PayProtocolFee:
|
|
receipt = await this._stakingApiWrapper.stakingContract
|
|
.payProtocolFee(this._poolOperator, this._takerAddress, this._protocolFee)
|
|
.awaitTransactionSuccessAsync({ from: this._exchangeAddress, value: this._protocolFee });
|
|
break;
|
|
|
|
case TestAction.CreatePool:
|
|
receipt = await this._stakingApiWrapper.stakingContract
|
|
.createStakingPool(0, true)
|
|
.awaitTransactionSuccessAsync({ from: this._poolOperator });
|
|
const createStakingPoolLog = receipt.logs[0];
|
|
// tslint:disable-next-line no-unnecessary-type-assertion
|
|
this._poolId = (createStakingPoolLog as DecodedLogEntry<any>).args.poolId;
|
|
break;
|
|
|
|
default:
|
|
throw new Error('Unrecognized test action');
|
|
}
|
|
if (receipt !== undefined) {
|
|
logs = receipt.logs as DecodedLogs;
|
|
}
|
|
combinedLogs.splice(combinedLogs.length, 0, ...logs);
|
|
}
|
|
return combinedLogs;
|
|
}
|
|
}
|