Adding some tests to the reward vault

This commit is contained in:
Greg Hysen
2019-06-10 18:49:24 -07:00
parent 8c839b5c22
commit 316ef69074
10 changed files with 121 additions and 33 deletions

View File

@@ -413,4 +413,10 @@ contract Staking is
{
zrxVault = IVault(_zrxVault);
}
function setRewardVault(address _rewardVault)
external
{
rewardVault = IRewardVault(_rewardVault);
}
}

View File

@@ -67,10 +67,8 @@ contract MixinFees is
return address(this).balance;
}
/*
function _payRebates()
{
}
*/
}

View File

@@ -57,6 +57,12 @@ contract MixinPools is
operatorShare: operatorShare
});
poolById[poolId] = pool;
// create pool in reward vault
rewardVault.createPool(
poolId,
operatorAddress
);
//
emit PoolCreated(poolId, operatorAddress, operatorShare);

View File

@@ -172,7 +172,7 @@ contract MixinStake is
/*
// update delegator's share of reward pool
// note that this uses the snapshot parameters
uint256 poolBalance = rebateVault.balanceOf(poolId);
uint256 poolBalance = rewardVault.balanceOf(poolId);
uint256 buyIn = _computeBuyInDenominatedInShadowAsset(
amount,
_delegatedStakeByPoolId,
@@ -204,7 +204,7 @@ contract MixinStake is
/*
// get payout
uint256 poolBalance = rebateVault.balanceOf(poolId);
uint256 poolBalance = rewardVault.balanceOf(poolId);
uint256 payoutInRealAsset;
uint256 payoutInShadowAsset;
if (_delegatedStakeToPoolByOwner == amount) {

View File

@@ -110,5 +110,5 @@ contract MixinStorage is
IVault zrxVault;
// Rebate Vault
IRewardVault rebateVault;
IRewardVault rewardVault;
}

View File

@@ -21,6 +21,10 @@ pragma solidity ^0.5.5;
interface IRewardVault {
function createPool(bytes32 poolId, address payable poolOwner)
external
payable;
function depositFor(bytes32 poolId)
external
payable;
@@ -37,7 +41,7 @@ interface IRewardVault {
view
returns (uint256);
function getOwner(bytes32 poolId)
function getPoolOwner(bytes32 poolId)
external
view
returns (address);

View File

@@ -36,8 +36,10 @@ contract RewardVault is
// but has all the necessary information to compute withdrawals in the event of
// a catastrophic failure
uint256 constant NIL_BALANCE =
// mapping from Pool to Rebate Balance in ETH
mapping (bytes32 => uint256) internal balancesByPoolId;
mapping (bytes32 => uint256) internal balanceByPoolId;
// mapping from owner to pool id
mapping (bytes32 => address payable) internal ownerByPoolId;
@@ -51,7 +53,7 @@ contract RewardVault is
payable
onlyStakingContract
{
balancesByPoolId[poolId] = _safeAdd(balancesByPoolId[poolId], msg.value);
balanceByPoolId[poolId] = _safeAdd(balanceByPoolId[poolId], msg.value);
}
function withdrawFor(bytes32 poolId, uint256 amount)
@@ -59,10 +61,10 @@ contract RewardVault is
onlyStakingContract
{
require(
amount <= balancesByPoolId[poolId],
amount <= balanceByPoolId[poolId],
"AMOUNT_EXCEEDS_BALANCE_OF_POOL"
);
balancesByPoolId[poolId] = _safeSub(balancesByPoolId[poolId], amount);
balanceByPoolId[poolId] = _safeSub(balanceByPoolId[poolId], amount);
stakingContractAddress.transfer(amount);
}
@@ -76,14 +78,14 @@ contract RewardVault is
owner != NIL_ADDRESS,
"INVALID_OWNER"
);
uint256 balanceInPool = balancesByPoolId[poolId];
uint256 balanceInPool = balanceByPoolId[poolId];
require(
balanceInPool > 0,
"POOL_BALANCE_IS_ZERO"
);
balancesByPoolId[poolId] = 0;
owner.transfer(balancesByPoolId[poolId]);
balanceByPoolId[poolId] = 0;
owner.transfer(balanceByPoolId[poolId]);
}
function balanceOf(bytes32 poolId)
@@ -91,6 +93,29 @@ contract RewardVault is
view
returns (uint256)
{
return balancesByPoolId[poolId];
return balanceByPoolId[poolId];
}
// It costs 1 wei to create a pool, but we don't enforce it here.
// it's enforced in the staking contract
function createPool(bytes32 poolId, address payable poolOwner)
external
payable
onlyStakingContract
{
require(
ownerByPoolId[poolId] == NIL_ADDRESS,
"POOL_ALREADY_EXISTS"
);
balanceByPoolId[poolId] = msg.value;
ownerByPoolId[poolId] = poolOwner;
}
function getPoolOwner(bytes32 poolId)
external
view
returns (address)
{
return ownerByPoolId[poolId];
}
}

View File

@@ -551,7 +551,34 @@ describe('Staking Core', () => {
});
it.only('Reward Vault', async () => {
//
/*
// 1 setup test parameters
const poolOperator = stakers[1];
const operatorShare = 39;
const poolId = await stakingWrapper.createPoolAsync(poolOperator, operatorShare);
const stakingContractAddress = stakingWrapper.getStakingContract().address;
const notStakingContractAddress = poolOperator;
const initialPoolDeposit = stakingWrapper.toBaseUnitAmount(19);
// create pool in vault
await stakingWrapper.rewardVaultCreatePoolAsync(poolId, poolOperator, initialPoolDeposit, stakingContractAddress);
*/
/*
// should fail to create pool if it already exists
await expectTransactionFailedAsync(
stakingWrapper.rewardVaultCreatePoolAsync(poolId, poolOperator, initialPoolDeposit, stakingContractAddress),
RevertReason.PoolAlreadyExists
);
// should fail to create a pool from an address other than the staking contract
await expectTransactionFailedAsync(
stakingWrapper.rewardVaultCreatePoolAsync(poolId, poolOperator, initialPoolDeposit, notStakingContractAddress),
RevertReason.OnlyCallableByStakingContract
);
*/
});
it.only('Staking Contract / Reward Vault Integration', async () => {
//
//const poolId = await stakingWrapper.createPoolAsync();
//await stakingWrapper.depositForAsync()
});

View File

@@ -64,6 +64,12 @@ export class StakingWrapper {
this._zrxTokenContract.address,
zrxAssetData
);
// deploy reward vault
this._rewardVaultContractIfExists = await RewardVaultContract.deployFrom0xArtifactAsync(
artifacts.RewardVault,
this._provider,
txDefaults,
);
// configure erc20 proxy to accept calls from zrx vault
await this._erc20ProxyContract.addAuthorizedAddress.awaitTransactionSuccessAsync((this._zrxVaultContractIfExists as ZrxVaultContract).address);
// deploy staking contract
@@ -92,17 +98,15 @@ export class StakingWrapper {
await this._web3Wrapper.sendTransactionAsync(setZrxVaultTxData)
);
// set reward vault in staking contract
/*
const setZrxVaultCalldata = await (this._stakingContractIfExists as StakingContract).setZrxVault.getABIEncodedTransactionData((this._zrxVaultContractIfExists as ZrxVaultContract).address);
const setZrxVaultTxData = {
const setRewardVaultCalldata = await (this._stakingContractIfExists as StakingContract).setRewardVault.getABIEncodedTransactionData((this._rewardVaultContractIfExists as RewardVaultContract).address);
const setRewardVaultTxData = {
from: this._ownerAddres,
to: (this._stakingProxyContractIfExists as StakingProxyContract).address,
data: setZrxVaultCalldata
data: setRewardVaultCalldata
}
await this._web3Wrapper.awaitTransactionSuccessAsync(
await this._web3Wrapper.sendTransactionAsync(setZrxVaultTxData)
await this._web3Wrapper.sendTransactionAsync(setRewardVaultTxData)
);
*/
// deploy libmath test
this._libMathTestContractIfExists = await LibMathTestContract.deployFrom0xArtifactAsync(
artifacts.LibMathTest,
@@ -405,21 +409,34 @@ export class StakingWrapper {
///// REWARD VAULT /////
public async depositRewardForAsync(poolId: string): Promise<BigNumber> {
public async rewardVaultDepositForAsync(poolId: string, amount: BigNumber, stakingContractAddress: string): Promise<TransactionReceiptWithDecodedLogs> {
const calldata = this.getRewardVaultContract().depositFor.getABIEncodedTransactionData(poolId);
const txReceipt = await this._executeTransactionAsync(calldata, stakingContractAddress, amount);
return txReceipt;
}
public async rewardVaultWithdrawFor(poolId: string, amount: BigNumber, stakingContractAddress: string): Promise<TransactionReceiptWithDecodedLogs> {
const calldata = this.getRewardVaultContract().withdrawFor.getABIEncodedTransactionData(poolId, amount);
const txReceipt = await this._executeTransactionAsync(calldata, stakingContractAddress);
return txReceipt;
}
public async rewardVaultWithdrawAllForAsync(poolId: string): Promise<TransactionReceiptWithDecodedLogs> {
const calldata = this.getRewardVaultContract().withdrawAllFrom.getABIEncodedTransactionData(poolId);
const txReceipt = await this._executeTransactionAsync(calldata);
return txReceipt;
}
public async rewardVaultEnterCatastrophicFailureModeAsync(zeroExMultisigAddress: string): Promise<TransactionReceiptWithDecodedLogs> {
const calldata = this.getRewardVaultContract().enterCatostrophicFailure.getABIEncodedTransactionData();
const txReceipt = await this._executeTransactionAsync(calldata, zeroExMultisigAddress);
return txReceipt;
}
public async rewardVaultGetBalanceAsync(poolId: string): Promise<BigNumber> {
const balance = await this.getRewardVaultContract().balanceOf.callAsync(poolId);
return balance;
}
public async withdrawRewardForAsync(poolId: string): Promise<BigNumber> {
const balance = await this.getRewardVaultContract().balanceOf.callAsync(poolId);
return balance;
}
public async withdrawAllRewardForAsync(poolId: string): Promise<BigNumber> {
const balance = await this.getRewardVaultContract().balanceOf.callAsync(poolId);
return balance;
}
public async getRewardBalanceInEthAsync(poolId: string): Promise<BigNumber> {
const balance = await this.getRewardVaultContract().balanceOf.callAsync(poolId);
return balance;
public async rewardVaultCreatePoolAsync(poolId: string, poolOwner: string, initialDeposit: BigNumber, stakingContractAddress: string): Promise<TransactionReceiptWithDecodedLogs> {
const calldata = this.getRewardVaultContract().createPool.getABIEncodedTransactionData(poolId, poolOwner);
const txReceipt = await this._executeTransactionAsync(calldata, stakingContractAddress, initialDeposit);
return txReceipt;
}
public async getEthBalanceOfRewardVaultAsync(): Promise<BigNumber> {
const balance = await this.getRewardVaultContract().balanceOf.callAsync(this.getZrxVaultContract().address);

View File

@@ -346,6 +346,11 @@ export enum RevertReason {
OnlyCallableByExchange = 'ONLY_CALLABLE_BY_EXCHANGE',
ExchangeAddressAlreadyRegistered = 'EXCHANGE_ADDRESS_ALREADY_REGISTERED',
ExchangeAddressNotRegistered = 'EXCHANGE_ADDRESS_NOT_REGISTERED',
PoolAlreadyExists = 'POOL_ALREADY_EXISTS',
PoolBalanceIsZero = 'POOL_BALANCE_IS_ZERO',
InvalidOwner = 'INVALID_OWNER',
AmountExceedsBalanceOfPool = 'AMOUNT_EXCEEDS_BALANCE_OF_POOL',
OnlyCallableByStakingContract = 'ONLY_CALLABLE_BY_STAKING_CONTRACT',
}
export enum StatusCodes {