Fix tests to no longer utilize active stake
This commit is contained in:
@@ -148,7 +148,7 @@ export class StakerActor extends BaseActor {
|
||||
public async stakeWithPoolAsync(poolId: string, amount: BigNumber): Promise<void> {
|
||||
await this.stakeAsync(amount);
|
||||
await this.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
amount,
|
||||
);
|
||||
@@ -182,10 +182,8 @@ export class StakerActor extends BaseActor {
|
||||
private _getNextEpochBalances(balances: StakeBalances): StakeBalances {
|
||||
const nextBalances = _.cloneDeep(balances);
|
||||
for (const balance of [
|
||||
nextBalances.activeStakeBalance,
|
||||
nextBalances.inactiveStakeBalance,
|
||||
nextBalances.delegatedStakeBalance,
|
||||
nextBalances.globalActiveStakeBalance,
|
||||
nextBalances.globalInactiveStakeBalance,
|
||||
nextBalances.globalDelegatedStakeBalance,
|
||||
...this._poolIds.map(poolId => nextBalances.delegatedStakeByPool[poolId]),
|
||||
@@ -202,10 +200,6 @@ export class StakerActor extends BaseActor {
|
||||
zrxBalance: await this._stakingApiWrapper.zrxTokenContract.balanceOf.callAsync(this._owner),
|
||||
stakeBalance: await this._stakingApiWrapper.stakingContract.getTotalStake.callAsync(this._owner),
|
||||
stakeBalanceInVault: await this._stakingApiWrapper.zrxVaultContract.balanceOf.callAsync(this._owner),
|
||||
activeStakeBalance: await this._stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
this._owner,
|
||||
StakeStatus.Active,
|
||||
),
|
||||
inactiveStakeBalance: await this._stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
this._owner,
|
||||
StakeStatus.Inactive,
|
||||
@@ -214,9 +208,6 @@ export class StakerActor extends BaseActor {
|
||||
this._owner,
|
||||
StakeStatus.Delegated,
|
||||
),
|
||||
globalActiveStakeBalance: await this._stakingApiWrapper.stakingContract.getGlobalStakeByStatus.callAsync(
|
||||
StakeStatus.Active,
|
||||
),
|
||||
globalInactiveStakeBalance: await this._stakingApiWrapper.stakingContract.getGlobalStakeByStatus.callAsync(
|
||||
StakeStatus.Inactive,
|
||||
),
|
||||
@@ -246,12 +237,6 @@ export class StakerActor extends BaseActor {
|
||||
expect(balances.stakeBalanceInVault, 'stake balance, recorded in vault').to.be.bignumber.equal(
|
||||
expectedBalances.stakeBalanceInVault,
|
||||
);
|
||||
expect(balances.activeStakeBalance.currentEpochBalance, 'active stake balance (current)').to.be.bignumber.equal(
|
||||
expectedBalances.activeStakeBalance.currentEpochBalance,
|
||||
);
|
||||
expect(balances.activeStakeBalance.nextEpochBalance, 'active stake balance (next)').to.be.bignumber.equal(
|
||||
expectedBalances.activeStakeBalance.nextEpochBalance,
|
||||
);
|
||||
expect(
|
||||
balances.inactiveStakeBalance.currentEpochBalance,
|
||||
'inactive stake balance (current)',
|
||||
@@ -266,10 +251,6 @@ export class StakerActor extends BaseActor {
|
||||
expect(balances.delegatedStakeBalance.nextEpochBalance, 'delegated stake balance (next)').to.be.bignumber.equal(
|
||||
expectedBalances.delegatedStakeBalance.nextEpochBalance,
|
||||
);
|
||||
expect(
|
||||
balances.globalActiveStakeBalance.currentEpochBalance,
|
||||
'global active stake (current)',
|
||||
).to.bignumber.equal(expectedBalances.globalActiveStakeBalance.currentEpochBalance);
|
||||
expect(
|
||||
balances.globalInactiveStakeBalance.currentEpochBalance,
|
||||
'global inactive stake (current)',
|
||||
@@ -278,9 +259,6 @@ export class StakerActor extends BaseActor {
|
||||
balances.globalDelegatedStakeBalance.currentEpochBalance,
|
||||
'global delegated stake (current)',
|
||||
).to.bignumber.equal(expectedBalances.globalDelegatedStakeBalance.currentEpochBalance);
|
||||
expect(balances.globalActiveStakeBalance.nextEpochBalance, 'global active stake (next)').to.bignumber.equal(
|
||||
expectedBalances.globalActiveStakeBalance.nextEpochBalance,
|
||||
);
|
||||
expect(balances.globalInactiveStakeBalance.nextEpochBalance, 'global inactive stake (next)').to.bignumber.equal(
|
||||
expectedBalances.globalInactiveStakeBalance.nextEpochBalance,
|
||||
);
|
||||
@@ -311,10 +289,7 @@ export class StakerActor extends BaseActor {
|
||||
// @TODO check receipt logs and return value via eth_call
|
||||
// check balances
|
||||
// from
|
||||
if (from.status === StakeStatus.Active) {
|
||||
StakerActor._decrementNextBalance(expectedBalances.activeStakeBalance, amount);
|
||||
StakerActor._decrementNextBalance(expectedBalances.globalActiveStakeBalance, amount);
|
||||
} else if (from.status === StakeStatus.Inactive) {
|
||||
if (from.status === StakeStatus.Inactive) {
|
||||
StakerActor._decrementNextBalance(expectedBalances.inactiveStakeBalance, amount);
|
||||
StakerActor._decrementNextBalance(expectedBalances.globalInactiveStakeBalance, amount);
|
||||
} else if (from.status === StakeStatus.Delegated && from.poolId !== undefined) {
|
||||
@@ -324,10 +299,7 @@ export class StakerActor extends BaseActor {
|
||||
StakerActor._decrementNextBalance(expectedBalances.totalDelegatedStakeByPool[from.poolId], amount);
|
||||
}
|
||||
// to
|
||||
if (to.status === StakeStatus.Active) {
|
||||
StakerActor._incrementNextBalance(expectedBalances.activeStakeBalance, amount);
|
||||
StakerActor._incrementNextBalance(expectedBalances.globalActiveStakeBalance, amount);
|
||||
} else if (to.status === StakeStatus.Inactive) {
|
||||
if (to.status === StakeStatus.Inactive) {
|
||||
StakerActor._incrementNextBalance(expectedBalances.inactiveStakeBalance, amount);
|
||||
StakerActor._incrementNextBalance(expectedBalances.globalInactiveStakeBalance, amount);
|
||||
} else if (to.status === StakeStatus.Delegated && to.poolId !== undefined) {
|
||||
@@ -347,8 +319,8 @@ export class StakerActor extends BaseActor {
|
||||
// check balances
|
||||
expectedBalances.zrxBalance = expectedBalances.zrxBalance.minus(amount);
|
||||
expectedBalances.stakeBalanceInVault = expectedBalances.stakeBalanceInVault.plus(amount);
|
||||
StakerActor._incrementCurrentAndNextBalance(expectedBalances.activeStakeBalance, amount);
|
||||
StakerActor._incrementCurrentAndNextBalance(expectedBalances.globalActiveStakeBalance, amount);
|
||||
StakerActor._incrementCurrentAndNextBalance(expectedBalances.inactiveStakeBalance, amount);
|
||||
StakerActor._incrementCurrentAndNextBalance(expectedBalances.globalInactiveStakeBalance, amount);
|
||||
return expectedBalances;
|
||||
}
|
||||
}
|
||||
|
@@ -40,11 +40,11 @@ blockchainTests.resets('Catastrophe Tests', env => {
|
||||
await stakingApiWrapper.stakingContract.stake.awaitTransactionSuccessAsync(amountToStake, {
|
||||
from: actors[0],
|
||||
});
|
||||
const activeStakeBalance = await stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
const inactiveStakeBalance = await stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
actors[0],
|
||||
StakeStatus.Active,
|
||||
StakeStatus.Inactive,
|
||||
);
|
||||
expect(activeStakeBalance.currentEpochBalance).to.be.bignumber.equal(amountToStake);
|
||||
expect(inactiveStakeBalance.currentEpochBalance).to.be.bignumber.equal(amountToStake);
|
||||
});
|
||||
it('should not change state when in read-only mode', async () => {
|
||||
// set to read-only mode
|
||||
@@ -54,11 +54,11 @@ blockchainTests.resets('Catastrophe Tests', env => {
|
||||
await stakingApiWrapper.stakingContract.stake.awaitTransactionSuccessAsync(amountToStake, {
|
||||
from: actors[0],
|
||||
});
|
||||
const activeStakeBalance = await stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
const inactiveStakeBalance = await stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
actors[0],
|
||||
StakeStatus.Active,
|
||||
StakeStatus.Inactive,
|
||||
);
|
||||
expect(activeStakeBalance.currentEpochBalance).to.be.bignumber.equal(ZERO);
|
||||
expect(inactiveStakeBalance.currentEpochBalance).to.be.bignumber.equal(ZERO);
|
||||
});
|
||||
it('should read values correctly when in read-only mode', async () => {
|
||||
// stake some zrx
|
||||
@@ -69,11 +69,11 @@ blockchainTests.resets('Catastrophe Tests', env => {
|
||||
// set to read-only mode
|
||||
await stakingApiWrapper.stakingProxyContract.setReadOnlyMode.awaitTransactionSuccessAsync(true);
|
||||
// read stake balance in read-only mode
|
||||
const activeStakeBalanceReadOnly = await stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
const inactiveStakeBalanceReadOnly = await stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
actors[0],
|
||||
StakeStatus.Active,
|
||||
StakeStatus.Inactive,
|
||||
);
|
||||
expect(activeStakeBalanceReadOnly.currentEpochBalance).to.be.bignumber.equal(amountToStake);
|
||||
expect(inactiveStakeBalanceReadOnly.currentEpochBalance).to.be.bignumber.equal(amountToStake);
|
||||
});
|
||||
it('should exit read-only mode', async () => {
|
||||
// set to read-only mode
|
||||
@@ -84,11 +84,11 @@ blockchainTests.resets('Catastrophe Tests', env => {
|
||||
await stakingApiWrapper.stakingContract.stake.awaitTransactionSuccessAsync(amountToStake, {
|
||||
from: actors[0],
|
||||
});
|
||||
const activeStakeBalance = await stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
const inactiveStakeBalance = await stakingApiWrapper.stakingContract.getOwnerStakeByStatus.callAsync(
|
||||
actors[0],
|
||||
StakeStatus.Active,
|
||||
StakeStatus.Inactive,
|
||||
);
|
||||
expect(activeStakeBalance.currentEpochBalance).to.be.bignumber.equal(amountToStake);
|
||||
expect(inactiveStakeBalance.currentEpochBalance).to.be.bignumber.equal(amountToStake);
|
||||
});
|
||||
it('should emit event when setting read-only mode', async () => {
|
||||
// set to read-only mode
|
||||
|
@@ -176,7 +176,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
const amount = toBaseUnitAmount(4);
|
||||
await stakers[0].stakeAsync(amount);
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
amount,
|
||||
);
|
||||
@@ -248,7 +248,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
const totalStakeAmount = toBaseUnitAmount(10);
|
||||
await stakers[0].stakeAsync(stakeAmounts[0]);
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
stakeAmounts[0],
|
||||
);
|
||||
@@ -259,7 +259,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
// second staker delegates (epoch 1)
|
||||
await stakers[1].stakeAsync(stakeAmounts[1]);
|
||||
await stakers[1].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
stakeAmounts[1],
|
||||
);
|
||||
@@ -355,7 +355,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
// undelegate (withdraws delegator's rewards)
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
stakeAmount,
|
||||
);
|
||||
// sanity check final balances
|
||||
@@ -436,7 +436,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
// undelegate stake and finalize epoch
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
stakeAmount,
|
||||
);
|
||||
|
||||
@@ -472,7 +472,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
// undelegate stake and finalize epoch
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
stakeAmount,
|
||||
);
|
||||
await payProtocolFeeAndFinalize();
|
||||
@@ -499,7 +499,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
// undelegate stake and finalize epoch
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
stakeAmount,
|
||||
);
|
||||
await payProtocolFeeAndFinalize();
|
||||
@@ -507,7 +507,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
await payProtocolFeeAndFinalize(rewardNotForDelegator);
|
||||
// delegate stake and go to next epoch
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
stakeAmount,
|
||||
);
|
||||
@@ -530,7 +530,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
const stakeAmount = toBaseUnitAmount(4);
|
||||
await stakers[0].stakeAsync(stakeAmount);
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
stakeAmount,
|
||||
);
|
||||
@@ -539,7 +539,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
// undelegate stake and finalize epoch
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
stakeAmount,
|
||||
);
|
||||
// this should go to the delegator
|
||||
@@ -547,7 +547,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
// delegate stake ~ this will result in a payout where rewards are computed on
|
||||
// the balance's `currentEpochBalance` field but not the `nextEpochBalance` field.
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
stakeAmount,
|
||||
);
|
||||
@@ -565,7 +565,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
const stakeAmount = toBaseUnitAmount(4);
|
||||
await stakers[0].stakeAsync(stakeAmount);
|
||||
await stakers[0].moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
stakeAmount,
|
||||
);
|
||||
@@ -595,7 +595,7 @@ blockchainTests.resets('Testing Rewards', env => {
|
||||
const undelegateAmount = toBaseUnitAmount(2.5);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolId),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
undelegateAmount,
|
||||
);
|
||||
// finalize
|
||||
|
@@ -76,42 +76,47 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
// epoch 1
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
// still epoch 1 ~ should be able to move stake again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
// still epoch 1 ~ should be able to move stake again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
amount,
|
||||
);
|
||||
});
|
||||
it("should be able to reassign next epoch's stake", async () => {
|
||||
// epoch 1
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
// still epoch 1 ~ should be able to move stake again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[1]),
|
||||
amount,
|
||||
);
|
||||
});
|
||||
it('should fail to move the same stake more than once', async () => {
|
||||
// epoch 1
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
// stake is now inactive, should not be able to move it out of active status again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
amount,
|
||||
new StakingRevertErrors.InsufficientBalanceError(amount, ZERO),
|
||||
);
|
||||
});
|
||||
it('should fail to reassign stake', async () => {
|
||||
// epoch 1
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
// still epoch 1 ~ should be able to move stake again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
// stake is now delegated; should fail to re-assign it from inactive back to active
|
||||
// stake is now inactive, should not be able to move it out of active status again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[1]),
|
||||
amount,
|
||||
new StakingRevertErrors.InsufficientBalanceError(amount, ZERO),
|
||||
);
|
||||
@@ -122,14 +127,14 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
// epoch 1
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAndMoveAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
// still epoch 1 ~ should be able to move stake again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
amount,
|
||||
);
|
||||
});
|
||||
@@ -137,58 +142,20 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
// epoch 1
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAndMoveAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
amount,
|
||||
);
|
||||
// stake is now inactive, should not be able to move it out of active status again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
amount,
|
||||
new StakingRevertErrors.InsufficientBalanceError(amount, ZERO),
|
||||
);
|
||||
});
|
||||
it('should fail to reassign stake', async () => {
|
||||
// epoch 1
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAndMoveAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
amount,
|
||||
);
|
||||
// still epoch 1 ~ should be able to move stake again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
// stake is now delegated; should fail to re-assign it from inactive back to active
|
||||
// stake is now inactive, should not be able to move it out of active status again
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[1]),
|
||||
amount,
|
||||
new StakingRevertErrors.InsufficientBalanceError(amount, ZERO),
|
||||
);
|
||||
});
|
||||
});
|
||||
describe('Move Zero Stake', () => {
|
||||
it('active -> active', async () => {
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Active), ZERO);
|
||||
});
|
||||
it('active -> inactive', async () => {
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), ZERO);
|
||||
});
|
||||
it('active -> delegated', async () => {
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
ZERO,
|
||||
);
|
||||
});
|
||||
it('inactive -> active', async () => {
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Inactive), new StakeInfo(StakeStatus.Active), ZERO);
|
||||
});
|
||||
it('inactive -> inactive', async () => {
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Inactive), new StakeInfo(StakeStatus.Inactive), ZERO);
|
||||
});
|
||||
@@ -199,13 +166,6 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
ZERO,
|
||||
);
|
||||
});
|
||||
it('delegated -> active', async () => {
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
ZERO,
|
||||
);
|
||||
});
|
||||
it('delegated -> inactive', async () => {
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
@@ -233,8 +193,8 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
// setup
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
if (from.status !== StakeStatus.Active) {
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), from, amount);
|
||||
if (from.status !== StakeStatus.Inactive) {
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Inactive), from, amount);
|
||||
}
|
||||
// run test, checking balances in epochs [n .. n + 2]
|
||||
// in epoch `n` - `next` is set
|
||||
@@ -242,21 +202,6 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
await staker.moveStakeAsync(from, to, amount.div(2));
|
||||
await staker.goToNextEpochAsync();
|
||||
};
|
||||
it('active -> active', async () => {
|
||||
await testMovePartialStake(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Active));
|
||||
});
|
||||
it('active -> inactive', async () => {
|
||||
await testMovePartialStake(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive));
|
||||
});
|
||||
it('active -> delegated', async () => {
|
||||
await testMovePartialStake(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
);
|
||||
});
|
||||
it('inactive -> active', async () => {
|
||||
await testMovePartialStake(new StakeInfo(StakeStatus.Inactive), new StakeInfo(StakeStatus.Active));
|
||||
});
|
||||
it('inactive -> inactive', async () => {
|
||||
await testMovePartialStake(new StakeInfo(StakeStatus.Inactive), new StakeInfo(StakeStatus.Inactive));
|
||||
});
|
||||
@@ -266,12 +211,6 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
);
|
||||
});
|
||||
it('delegated -> active', async () => {
|
||||
await testMovePartialStake(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
);
|
||||
});
|
||||
it('delegated -> inactive', async () => {
|
||||
await testMovePartialStake(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
@@ -290,20 +229,9 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[1]),
|
||||
);
|
||||
});
|
||||
it('active -> delegated (non-existent pool)', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Delegated, unusedPoolId),
|
||||
amount,
|
||||
new StakingRevertErrors.PoolExistenceError(unusedPoolId, false),
|
||||
);
|
||||
});
|
||||
it('inactive -> delegated (non-existent pool)', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, unusedPoolId),
|
||||
@@ -315,7 +243,7 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
@@ -326,16 +254,6 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
new StakingRevertErrors.PoolExistenceError(unusedPoolId, false),
|
||||
);
|
||||
});
|
||||
it('delegated (non-existent pool) -> active', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, unusedPoolId),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
amount,
|
||||
new StakingRevertErrors.PoolExistenceError(unusedPoolId, false),
|
||||
);
|
||||
});
|
||||
});
|
||||
describe('Unstake', () => {
|
||||
it('should successfully unstake zero ZRX', async () => {
|
||||
@@ -345,102 +263,126 @@ blockchainTests.resets('Stake Statuses', env => {
|
||||
it('should successfully unstake after becoming inactive', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
amount,
|
||||
);
|
||||
await staker.goToNextEpochAsync(); // stake is now inactive
|
||||
await staker.unstakeAsync(amount);
|
||||
});
|
||||
it('should fail to unstake with insufficient balance', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.unstakeAsync(amount, new StakingRevertErrors.InsufficientBalanceError(amount, ZERO));
|
||||
});
|
||||
it('should fail to unstake in the same epoch as stake was set to inactive', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
await staker.goToNextEpochAsync(); // stake is now delegated
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
amount,
|
||||
);
|
||||
await staker.unstakeAsync(amount, new StakingRevertErrors.InsufficientBalanceError(amount, ZERO));
|
||||
});
|
||||
it('should fail to unstake in same epoch that inactive stake has been reactivated', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
await staker.goToNextEpochAsync(); // stake is now inactive
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Inactive), new StakeInfo(StakeStatus.Active), amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
await staker.unstakeAsync(amount, new StakingRevertErrors.InsufficientBalanceError(amount, ZERO));
|
||||
});
|
||||
it('should fail to unstake one epoch after inactive stake has been reactivated', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
await staker.goToNextEpochAsync(); // stake is now inactive
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Inactive), new StakeInfo(StakeStatus.Active), amount);
|
||||
await staker.goToNextEpochAsync(); // stake is active
|
||||
await staker.unstakeAsync(amount, new StakingRevertErrors.InsufficientBalanceError(amount, ZERO));
|
||||
});
|
||||
it('should fail to unstake >1 epoch after inactive/withdrawable stake has been reactivated', async () => {
|
||||
it('should fail to unstake >1 epoch after inactive stake has been reactivated', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Active), new StakeInfo(StakeStatus.Inactive), amount);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
amount,
|
||||
);
|
||||
await staker.goToNextEpochAsync(); // stake is now inactive
|
||||
await staker.goToNextEpochAsync(); // stake is now withdrawable
|
||||
await staker.moveStakeAsync(new StakeInfo(StakeStatus.Inactive), new StakeInfo(StakeStatus.Active), amount);
|
||||
await staker.goToNextEpochAsync(); // stake is active and not withdrawable
|
||||
await staker.goToNextEpochAsync(); // stake is active and not withdrawable
|
||||
await staker.unstakeAsync(amount, new StakingRevertErrors.InsufficientBalanceError(amount, ZERO));
|
||||
});
|
||||
it('should successfuly unstake freshly deposited stake', async () => {
|
||||
const amount = toBaseUnitAmount(10);
|
||||
await staker.stakeAsync(amount);
|
||||
await staker.unstakeAsync(amount);
|
||||
});
|
||||
});
|
||||
describe('Simulations', () => {
|
||||
it('Simulation from Staking Spec', async () => {
|
||||
// Epoch 1: Stake some ZRX
|
||||
await staker.stakeAsync(toBaseUnitAmount(4));
|
||||
// Later in Epoch 1: User delegates and deactivates some stake
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
toBaseUnitAmount(1),
|
||||
);
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
toBaseUnitAmount(2),
|
||||
);
|
||||
// Epoch 2: Status updates (no user intervention required)
|
||||
await staker.goToNextEpochAsync();
|
||||
// Epoch 3: Stake that has been inactive for an epoch can be withdrawn (no user intervention required)
|
||||
await staker.goToNextEpochAsync();
|
||||
// Later in Epoch 3: User reactivates half of their inactive stake; this becomes Active next epoch
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
toBaseUnitAmount(0.5),
|
||||
);
|
||||
// Later in Epoch 3: User re-delegates half of their stake from Pool 1 to Pool 2
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
new StakeInfo(StakeStatus.Delegated, poolIds[1]),
|
||||
toBaseUnitAmount(1),
|
||||
);
|
||||
// Epoch 4: Status updates (no user intervention required)
|
||||
await staker.goToNextEpochAsync();
|
||||
// Later in Epoch 4: User deactivates all active stake
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
toBaseUnitAmount(1.5),
|
||||
);
|
||||
// Later in Epoch 4: User withdraws all available inactive stake
|
||||
await staker.unstakeAsync(toBaseUnitAmount(0.5));
|
||||
// Epoch 5: Status updates (no user intervention required)
|
||||
await staker.goToNextEpochAsync();
|
||||
// Later in Epoch 5: User reactivates a portion of their stake
|
||||
await staker.moveStakeAsync(
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
toBaseUnitAmount(1),
|
||||
);
|
||||
// Epoch 6: Status updates (no user intervention required)
|
||||
await staker.goToNextEpochAsync();
|
||||
});
|
||||
// it('Simulation from Staking Spec', async () => {
|
||||
// // Epoch 1: Stake some ZRX
|
||||
// await staker.stakeAsync(toBaseUnitAmount(4));
|
||||
// // Later in Epoch 1: User delegates and deactivates some stake
|
||||
// await staker.moveStakeAsync(
|
||||
// new StakeInfo(StakeStatus.Active),
|
||||
// new StakeInfo(StakeStatus.Inactive),
|
||||
// toBaseUnitAmount(1),
|
||||
// );
|
||||
// await staker.moveStakeAsync(
|
||||
// new StakeInfo(StakeStatus.Active),
|
||||
// new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
// toBaseUnitAmount(2),
|
||||
// );
|
||||
// // Epoch 2: Status updates (no user intervention required)
|
||||
// await staker.goToNextEpochAsync();
|
||||
// // Epoch 3: Stake that has been inactive for an epoch can be withdrawn (no user intervention required)
|
||||
// await staker.goToNextEpochAsync();
|
||||
// // Later in Epoch 3: User reactivates half of their inactive stake; this becomes Active next epoch
|
||||
// await staker.moveStakeAsync(
|
||||
// new StakeInfo(StakeStatus.Inactive),
|
||||
// new StakeInfo(StakeStatus.Active),
|
||||
// toBaseUnitAmount(0.5),
|
||||
// );
|
||||
// // Later in Epoch 3: User re-delegates half of their stake from Pool 1 to Pool 2
|
||||
// await staker.moveStakeAsync(
|
||||
// new StakeInfo(StakeStatus.Delegated, poolIds[0]),
|
||||
// new StakeInfo(StakeStatus.Delegated, poolIds[1]),
|
||||
// toBaseUnitAmount(1),
|
||||
// );
|
||||
// // Epoch 4: Status updates (no user intervention required)
|
||||
// await staker.goToNextEpochAsync();
|
||||
// // Later in Epoch 4: User deactivates all active stake
|
||||
// await staker.moveStakeAsync(
|
||||
// new StakeInfo(StakeStatus.Active),
|
||||
// new StakeInfo(StakeStatus.Inactive),
|
||||
// toBaseUnitAmount(1.5),
|
||||
// );
|
||||
// // Later in Epoch 4: User withdraws all available inactive stake
|
||||
// await staker.unstakeAsync(toBaseUnitAmount(0.5));
|
||||
// // Epoch 5: Status updates (no user intervention required)
|
||||
// await staker.goToNextEpochAsync();
|
||||
// // Later in Epoch 5: User reactivates a portion of their stake
|
||||
// await staker.moveStakeAsync(
|
||||
// new StakeInfo(StakeStatus.Inactive),
|
||||
// new StakeInfo(StakeStatus.Active),
|
||||
// toBaseUnitAmount(1),
|
||||
// );
|
||||
// // Epoch 6: Status updates (no user intervention required)
|
||||
// await staker.goToNextEpochAsync();
|
||||
// });
|
||||
});
|
||||
});
|
||||
// tslint:enable:no-unnecessary-type-assertion
|
||||
|
@@ -120,7 +120,7 @@ export class CumulativeRewardTrackingSimulation {
|
||||
from: this._staker,
|
||||
});
|
||||
receipt = await this._stakingApiWrapper.stakingContract.moveStake.awaitTransactionSuccessAsync(
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
new StakeInfo(StakeStatus.Delegated, this._poolId),
|
||||
this._amountToStake,
|
||||
{ from: this._staker },
|
||||
@@ -130,7 +130,7 @@ export class CumulativeRewardTrackingSimulation {
|
||||
case TestAction.Undelegate:
|
||||
receipt = await this._stakingApiWrapper.stakingContract.moveStake.awaitTransactionSuccessAsync(
|
||||
new StakeInfo(StakeStatus.Delegated, this._poolId),
|
||||
new StakeInfo(StakeStatus.Active),
|
||||
new StakeInfo(StakeStatus.Inactive),
|
||||
this._amountToStake,
|
||||
{ from: this._staker },
|
||||
);
|
||||
|
@@ -68,7 +68,6 @@ export interface StakeBalanceByPool {
|
||||
}
|
||||
|
||||
export enum StakeStatus {
|
||||
Active,
|
||||
Inactive,
|
||||
Delegated,
|
||||
}
|
||||
@@ -88,10 +87,8 @@ export interface StakeBalances {
|
||||
zrxBalance: BigNumber;
|
||||
stakeBalance: BigNumber;
|
||||
stakeBalanceInVault: BigNumber;
|
||||
activeStakeBalance: StoredBalance;
|
||||
inactiveStakeBalance: StoredBalance;
|
||||
delegatedStakeBalance: StoredBalance;
|
||||
globalActiveStakeBalance: StoredBalance;
|
||||
globalInactiveStakeBalance: StoredBalance;
|
||||
globalDelegatedStakeBalance: StoredBalance;
|
||||
delegatedStakeByPool: StakeBalanceByPool;
|
||||
|
Reference in New Issue
Block a user