Adding some tests to the reward vault
This commit is contained in:
@@ -413,4 +413,10 @@ contract Staking is
|
||||
{
|
||||
zrxVault = IVault(_zrxVault);
|
||||
}
|
||||
|
||||
function setRewardVault(address _rewardVault)
|
||||
external
|
||||
{
|
||||
rewardVault = IRewardVault(_rewardVault);
|
||||
}
|
||||
}
|
||||
|
@@ -67,10 +67,8 @@ contract MixinFees is
|
||||
return address(this).balance;
|
||||
}
|
||||
|
||||
/*
|
||||
function _payRebates()
|
||||
{
|
||||
|
||||
}
|
||||
*/
|
||||
}
|
@@ -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);
|
||||
|
@@ -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) {
|
||||
|
@@ -110,5 +110,5 @@ contract MixinStorage is
|
||||
IVault zrxVault;
|
||||
|
||||
// Rebate Vault
|
||||
IRewardVault rebateVault;
|
||||
IRewardVault rewardVault;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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];
|
||||
}
|
||||
}
|
||||
|
@@ -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()
|
||||
});
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user