Track state of read-only mode in stakingProxy

This commit is contained in:
Amir Bandeali
2019-10-06 00:11:55 -07:00
parent 681e6eab7a
commit 414084a7ad
6 changed files with 49 additions and 8 deletions

View File

@@ -20,6 +20,7 @@ pragma solidity ^0.5.9;
pragma experimental ABIEncoderV2;
import "./libs/LibProxy.sol";
import "./libs/LibSafeDowncast.sol";
import "./immutable/MixinStorage.sol";
import "./interfaces/IStorageInit.sol";
import "./interfaces/IStakingProxy.sol";
@@ -30,6 +31,7 @@ contract StakingProxy is
MixinStorage
{
using LibProxy for address;
using LibSafeDowncast for uint256;
/// @dev Constructor.
/// @param _stakingContract Staking contract to delegate calls to.
@@ -86,16 +88,25 @@ contract StakingProxy is
}
/// @dev Set read-only mode (state cannot be changed).
function setReadOnlyMode(bool readOnlyMode)
function setReadOnlyMode(bool shouldSetReadOnlyMode)
external
onlyAuthorized
{
if (readOnlyMode) {
uint96 timestamp = block.timestamp.downcastToUint96();
if (shouldSetReadOnlyMode) {
stakingContract = readOnlyProxy;
readOnlyState = IStructs.ReadOnlyState({
isReadOnlyModeSet: true,
lastSetTimestamp: timestamp
});
} else {
stakingContract = readOnlyProxyCallee;
readOnlyState.isReadOnlyModeSet = false;
}
emit ReadOnlyModeSet(readOnlyMode);
emit ReadOnlyModeSet(
shouldSetReadOnlyMode,
timestamp
);
}
/// @dev Batch executes a series of calls to the staking contract.
@@ -108,9 +119,9 @@ contract StakingProxy is
// Initialize commonly used variables.
bool success;
bytes memory returnData;
batchReturnData = new bytes[](data.length);
address staking = stakingContract;
uint256 dataLength = data.length;
batchReturnData = new bytes[](dataLength);
address staking = stakingContract;
// Ensure that a staking contract has been attached to the proxy.
if (staking == address(0)) {

View File

@@ -105,6 +105,7 @@ contract ZrxVault is
function enterCatastrophicFailure()
external
onlyAuthorized
onlyNotInCatastrophicFailure
{
isInCatastrophicFailure = true;
emit InCatastrophicFailureMode(msg.sender);

View File

@@ -41,7 +41,10 @@ contract MixinStorage is
// address for read-only proxy to call
address public readOnlyProxyCallee;
// mapping from StakeStatus to gloabl stored balance
// state of read-only mode in stakingProxy
IStructs.ReadOnlyState public readOnlyState;
// mapping from StakeStatus to global stored balance
// (access using _loadSyncedBalance or _loadUnsyncedBalance)
// NOTE: only Status.DELEGATED is used to access this mapping, but this format
// is used for extensibility

View File

@@ -17,9 +17,12 @@
*/
pragma solidity ^0.5.9;
pragma experimental ABIEncoderV2;
import "./IStructs.sol";
interface IStakingProxy /* is IStaking */
contract IStakingProxy /* is IStaking */
{
/// @dev Emitted by StakingProxy when a staking contract is attached.
@@ -33,7 +36,8 @@ interface IStakingProxy /* is IStaking */
/// @dev Emitted by StakingProxy when read-only mode is set.
event ReadOnlyModeSet(
bool readOnlyMode
bool readOnlyMode,
uint96 timestamp
);
/// @dev Delegates calls to the staking contract, if it is set.
@@ -52,4 +56,10 @@ interface IStakingProxy /* is IStaking */
/// Note that this is callable only by an authorized address.
function detachStakingContract()
external;
/// @dev Gets state of stakingProxy read-only mode.
function readOnlyState()
external
view
returns (IStructs.ReadOnlyState memory);
}

View File

@@ -21,6 +21,14 @@ pragma solidity ^0.5.9;
interface IStructs {
/// @dev State of stakingProxy read-only mode.
/// @param isReadOnlyModeSet True if in read-only mode.
/// @param lastSetTimestamp Timestamp at which read-only mode was last set.
struct ReadOnlyState {
bool isReadOnlyModeSet;
uint96 lastSetTimestamp;
}
/// @dev Status for a pool that actively traded during the current epoch.
/// (see MixinExchangeFees).
/// @param feesCollected Fees collected in ETH by this pool.

View File

@@ -118,6 +118,14 @@ contract TestStorageLayoutAndConstants is
)
slot := add(slot, 0x1)
assertSlotAndOffset(
readOnlyState_slot,
readOnlyState_offset,
slot,
offset
)
slot := add(slot, 0x1)
assertSlotAndOffset(
_globalStakeByStatus_slot,
_globalStakeByStatus_offset,