cleaned up staker actor

This commit is contained in:
Greg Hysen
2019-06-25 18:07:03 -07:00
parent 38cad56bf9
commit 8343105b54
2 changed files with 39 additions and 97 deletions

View File

@@ -28,9 +28,7 @@ export class StakerActor {
public async depositAsync(amount: BigNumber, revertReason?: RevertReason) {
// query init balances
const initZrxBalanceOfVault = await this._stakingWrapper.getZrxTokenBalanceOfZrxVault();
const initZrxBalanceOfOwner = await this._stakingWrapper.getZrxTokenBalance(this._owner);
const initStakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
const initStakeBalanceOfOwnerInVault = await this._stakingWrapper.getZrxVaultBalance(this._owner);
const initStakerBalances = await this.getBalancesAsync();
// deposit stake
const txReceiptPromise = this._stakingWrapper.depositAsync(this._owner, amount);
if (revertReason !== undefined) {
@@ -42,33 +40,26 @@ export class StakerActor {
}
const txReceipt = await txReceiptPromise;
// @TODO check receipt logs and return value via eth_call
// query final balances
// check balances
let expectedStakerBalances = initStakerBalances;
expectedStakerBalances.zrxBalance = initStakerBalances.zrxBalance.plus(amount);
expectedStakerBalances.stakeBalance = initStakerBalances.stakeBalance.plus(amount);
expectedStakerBalances.stakeBalanceInVault = initStakerBalances.stakeBalanceInVault.plus(amount);
expectedStakerBalances.withdrawableStakeBalance = initStakerBalances.withdrawableStakeBalance.plus(amount);
expectedStakerBalances.activatableStakeBalance = initStakerBalances.activatableStakeBalance.plus(amount);
expectedStakerBalances.deactivatedStakeBalance = initStakerBalances.deactivatedStakeBalance.plus(amount);
await this.assertBalancesAsync(expectedStakerBalances);
// check zrx balance of vault
const finalZrxBalanceOfVault = await this._stakingWrapper.getZrxTokenBalanceOfZrxVault();
const finalZrxBalanceOfOwner = await this._stakingWrapper.getZrxTokenBalance(this._owner);
const finalStakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
const finalStakeBalanceOfOwnerInVault = await this._stakingWrapper.getZrxVaultBalance(this._owner);
// validate final balances
expect(finalZrxBalanceOfVault).to.be.bignumber.equal(initZrxBalanceOfVault.plus(amount));
expect(finalZrxBalanceOfOwner).to.be.bignumber.equal(initZrxBalanceOfOwner.minus(amount));
expect(finalStakeBalanceOfOwner).to.be.bignumber.equal(initStakeBalanceOfOwner.plus(amount));
expect(finalStakeBalanceOfOwnerInVault).to.be.bignumber.equal(initStakeBalanceOfOwnerInVault.plus(amount));
expect(finalZrxBalanceOfVault).to.be.bignumber.equal(initZrxBalanceOfVault.minus(amount));
}
public async depositAndStakeAsync(amount: BigNumber, revertReason?: RevertReason) {
// @TODO - Implement
const txReceipt = this._stakingWrapper.depositAndStakeAsync(this._owner, amount);
}
public async activateStakeAsync(amount: BigNumber, revertReason?: RevertReason) {
// query init balances
const initStakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
const initWithdrawableStakeBalance = await this._stakingWrapper.getWithdrawableStakeAsync(this._owner);
const initActivatedStakeBalance = await this._stakingWrapper.getActivatedStakeAsync(this._owner);
const initActivatableStakeBalance = await this._stakingWrapper.getActivatableStakeAsync(this._owner);
const initDeactivatedStakeBalance = await this._stakingWrapper.getDeactivatedStakeAsync(this._owner);
const initTimelockedStakeBalance = await this._stakingWrapper.getTimelockedStakeAsync(this._owner);
const initStakerBalances = await this.getBalancesAsync();
// activate stake
const txReceiptPromise = this._stakingWrapper.activateStakeAsync(this._owner, amount);
if (revertReason !== undefined) {
@@ -80,30 +71,17 @@ export class StakerActor {
}
const txReceipt = await txReceiptPromise;
// @TODO check receipt logs and return value via eth_call
// check total stake balance didn't change
const stakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
expect(stakeBalanceOfOwner).to.be.bignumber.equal(initStakeBalanceOfOwner);
// check timelocked stake is no longer activated
const activatedStakeBalance = await this._stakingWrapper.getActivatedStakeAsync(this._owner);
expect(activatedStakeBalance).to.be.bignumber.equal(initActivatedStakeBalance.plus(amount));
// check that timelocked stake is deactivated
const deactivatedStakeBalance = await this._stakingWrapper.getDeactivatedStakeAsync(this._owner);
expect(deactivatedStakeBalance).to.be.bignumber.equal(initDeactivatedStakeBalance.minus(amount));
// check amount that is timelocked
const timelockedStakeBalance = await this._stakingWrapper.getTimelockedStakeAsync(this._owner);
expect(timelockedStakeBalance).to.be.bignumber.equal(initTimelockedStakeBalance);
// check that timelocked stake cannot be withdrawn
const withdrawableStakeBalance = await this._stakingWrapper.getWithdrawableStakeAsync(this._owner);
expect(withdrawableStakeBalance).to.be.bignumber.equal(initWithdrawableStakeBalance.minus(amount));
// check that timelocked stake cannot be reactivated
const activatableStakeBalance = await this._stakingWrapper.getActivatableStakeAsync(this._owner);
expect(activatableStakeBalance).to.be.bignumber.equal(initActivatableStakeBalance.minus(amount));
// check balances
let expectedStakerBalances = initStakerBalances;
expectedStakerBalances.withdrawableStakeBalance = initStakerBalances.withdrawableStakeBalance.minus(amount);
expectedStakerBalances.activatableStakeBalance = initStakerBalances.activatableStakeBalance.minus(amount);
expectedStakerBalances.activatedStakeBalance = initStakerBalances.activatedStakeBalance.plus(amount);
expectedStakerBalances.deactivatedStakeBalance = initStakerBalances.deactivatedStakeBalance.minus(amount);
await this.assertBalancesAsync(expectedStakerBalances);
}
public async deactivateAndTimelockStakeAsync(amount: BigNumber, revertReason?: RevertReason) {
// query init balances
const initStakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
const initWithdrawableStakeBalance = await this._stakingWrapper.getWithdrawableStakeAsync(this._owner);
const initActivatableStakeBalance = await this._stakingWrapper.getActivatableStakeAsync(this._owner);
const initStakerBalances = await this.getBalancesAsync();
// deactivate and timelock stake
const txReceiptPromise = this._stakingWrapper.deactivateAndTimelockStakeAsync(this._owner, amount);
if (revertReason !== undefined) {
@@ -115,35 +93,17 @@ export class StakerActor {
}
const txReceipt = await txReceiptPromise;
// @TODO check receipt logs and return value via eth_call
// check total stake balance didn't change
const stakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
expect(stakeBalanceOfOwner).to.be.bignumber.equal(initStakeBalanceOfOwner);
// check timelocked stake is no longer activated
const activatedStakeBalance = await this._stakingWrapper.getActivatedStakeAsync(this._owner);
expect(activatedStakeBalance).to.be.bignumber.equal(initStakeBalanceOfOwner.minus(amount));
// check that timelocked stake is deactivated
const deactivatedStakeBalance = await this._stakingWrapper.getDeactivatedStakeAsync(this._owner);
expect(deactivatedStakeBalance).to.be.bignumber.equal(amount);
// check amount that is timelocked
const timelockedStakeBalance = await this._stakingWrapper.getTimelockedStakeAsync(this._owner);
expect(timelockedStakeBalance).to.be.bignumber.equal(amount);
// check that timelocked stake cannot be withdrawn
const withdrawableStakeBalance = await this._stakingWrapper.getWithdrawableStakeAsync(this._owner);
expect(withdrawableStakeBalance).to.be.bignumber.equal(initWithdrawableStakeBalance);
// check that timelocked stake cannot be reactivated
const activatableStakeBalance = await this._stakingWrapper.getActivatableStakeAsync(this._owner);
expect(activatableStakeBalance).to.be.bignumber.equal(initActivatableStakeBalance);
// check balances
let expectedStakerBalances = initStakerBalances;
expectedStakerBalances.activatedStakeBalance = initStakerBalances.activatedStakeBalance.minus(amount);
expectedStakerBalances.timelockedStakeBalance = initStakerBalances.timelockedStakeBalance.plus(amount);
expectedStakerBalances.deactivatedStakeBalance = initStakerBalances.deactivatedStakeBalance.plus(amount);
await this.assertBalancesAsync(expectedStakerBalances);
}
public async withdrawAsync(amount: BigNumber, revertReason?: RevertReason) {
// query init balances
const initZrxBalanceOfVault = await this._stakingWrapper.getZrxTokenBalanceOfZrxVault();
const initZrxBalanceOfOwner = await this._stakingWrapper.getZrxTokenBalance(this._owner);
const initStakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
const initStakeBalanceOfOwnerInVault = await this._stakingWrapper.getZrxVaultBalance(this._owner);
const initWithdrawableStakeBalance = await this._stakingWrapper.getWithdrawableStakeAsync(this._owner);
const initActivatedStakeBalance = await this._stakingWrapper.getActivatedStakeAsync(this._owner);
const initActivatableStakeBalance = await this._stakingWrapper.getActivatableStakeAsync(this._owner);
const initDeactivatedStakeBalance = await this._stakingWrapper.getDeactivatedStakeAsync(this._owner);
const initTimelockedStakeBalance = await this._stakingWrapper.getTimelockedStakeAsync(this._owner);
const initStakerBalances = await this.getBalancesAsync();
// withdraw stake
const txReceiptPromise = this._stakingWrapper.withdrawAsync(this._owner, amount);
if (revertReason !== undefined) {
@@ -155,33 +115,18 @@ export class StakerActor {
}
const txReceipt = await txReceiptPromise;
// @TODO check receipt logs and return value via eth_call
// check total stake balance
const stakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
expect(stakeBalanceOfOwner).to.be.bignumber.equal(initStakeBalanceOfOwner.minus(amount));
// check timelocked stake didn't change
const activatedStakeBalance = await this._stakingWrapper.getActivatedStakeAsync(this._owner);
expect(activatedStakeBalance).to.be.bignumber.equal(initActivatedStakeBalance);
// check deactivated stake
const deactivatedStakeBalance = await this._stakingWrapper.getDeactivatedStakeAsync(this._owner);
expect(deactivatedStakeBalance).to.be.bignumber.equal(initDeactivatedStakeBalance.minus(amount));
// check amount that is timelocked
const timelockedStakeBalance = await this._stakingWrapper.getTimelockedStakeAsync(this._owner);
expect(timelockedStakeBalance).to.be.bignumber.equal(initTimelockedStakeBalance);
// check that timelocked stake cannot be withdrawn
const withdrawableStakeBalance = await this._stakingWrapper.getWithdrawableStakeAsync(this._owner);
expect(withdrawableStakeBalance).to.be.bignumber.equal(initWithdrawableStakeBalance.minus(amount));
// check that timelocked stake cannot be reactivated
const activatableStakeBalance = await this._stakingWrapper.getActivatableStakeAsync(this._owner);
expect(activatableStakeBalance).to.be.bignumber.equal(initActivatableStakeBalance.minus(amount));
// check zrx balances
// check balances
let expectedStakerBalances = initStakerBalances;
expectedStakerBalances.zrxBalance = initStakerBalances.zrxBalance.plus(amount);
expectedStakerBalances.stakeBalance = initStakerBalances.stakeBalance.minus(amount);
expectedStakerBalances.stakeBalanceInVault = initStakerBalances.stakeBalanceInVault.minus(amount);
expectedStakerBalances.withdrawableStakeBalance = initStakerBalances.withdrawableStakeBalance.minus(amount);
expectedStakerBalances.activatableStakeBalance = initStakerBalances.activatableStakeBalance.minus(amount);
expectedStakerBalances.deactivatedStakeBalance = initStakerBalances.deactivatedStakeBalance.minus(amount);
await this.assertBalancesAsync(expectedStakerBalances);
// check zrx balance of vault
const finalZrxBalanceOfVault = await this._stakingWrapper.getZrxTokenBalanceOfZrxVault();
const finalZrxBalanceOfOwner = await this._stakingWrapper.getZrxTokenBalance(this._owner);
const finalStakeBalanceOfOwner = await this._stakingWrapper.getTotalStakeAsync(this._owner);
const finalStakeBalanceOfOwnerInVault = await this._stakingWrapper.getZrxVaultBalance(this._owner);
expect(finalZrxBalanceOfVault).to.be.bignumber.equal(initZrxBalanceOfVault.minus(amount));
expect(finalZrxBalanceOfOwner).to.be.bignumber.equal(initZrxBalanceOfOwner.plus(amount));
expect(finalStakeBalanceOfOwner).to.be.bignumber.equal(initStakeBalanceOfOwner.minus(amount));
expect(finalStakeBalanceOfOwnerInVault).to.be.bignumber.equal(initStakeBalanceOfOwnerInVault.minus(amount));
}
public async getBalancesAsync(): Promise<StakerBalances> {

View File

@@ -119,13 +119,10 @@ describe('Staking Core', () => {
await staker.deactivateAndTimelockStakeAsync(amountToDeactivate);
// note - we cannot re-activate this timelocked stake until at least one full timelock period has passed.
// attempting to do so should revert.
console.log('first');
await staker.activateStakeAsync(amountToReactivate, RevertReason.InsufficientBalance);
await staker.skipToNextTimelockPeriodAsync();
console.log('second');
await staker.activateStakeAsync(amountToReactivate, RevertReason.InsufficientBalance);
await staker.skipToNextTimelockPeriodAsync();
console.log('done');
// this forces the internal state to update; it is not necessary to activate stake, but
// allows us to check that state is updated correctly after a timelock period rolls over.
await staker.forceTimelockSyncAsync();